[{"data":1,"prerenderedAt":11304},["ShallowReactive",2],{"navigation":3,"/migrations/reversing-migrations":1016,"/migrations/reversing-migrations-surround":11299},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":358,"body":1018,"description":1028,"extension":11294,"links":11295,"meta":11296,"navigation":1063,"path":359,"seo":11297,"stem":360,"__hash__":11298},"docs/08.migrations/07.reversing-migrations.md",{"type":1019,"value":1020,"toc":11281},"minimark",[1021,1025,1029,1034,1039,2397,2401,5338,5342,5346,7267,7271,9734,9738,9742,11274,11277],[1022,1023,358],"h1",{"id":1024},"reversing-migrations",[1026,1027,1028],"p",{},"Migration reversal is a critical aspect of Django's migration system, allowing you to undo database changes safely. Understanding how to reverse migrations, handle data preservation, and manage rollback scenarios is essential for maintaining database integrity during development and production deployments.",[1030,1031,1033],"h2",{"id":1032},"understanding-migration-reversal","Understanding Migration Reversal",[1035,1036,1038],"h3",{"id":1037},"basic-rollback-operations","Basic Rollback Operations",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Basic migration rollback commands\n\n# Rollback to a specific migration\n# python manage.py migrate blog 0003\n\n# Rollback all migrations for an app\n# python manage.py migrate blog zero\n\n# Show what would be rolled back without applying\n# python manage.py migrate blog 0003 --plan\n\n# Example migration with proper reverse operations\nclass Migration(migrations.Migration):\n    \"\"\"Migration with reversible operations\"\"\"\n    \n    dependencies = [\n        ('blog', '0003_add_tags'),\n    ]\n    \n    operations = [\n        # Reversible: AddField automatically generates RemoveField for reverse\n        migrations.AddField(\n            model_name='post',\n            name='view_count',\n            field=models.PositiveIntegerField(default=0),\n        ),\n        \n        # Reversible: AlterField can be reversed to previous state\n        migrations.AlterField(\n            model_name='post',\n            name='title',\n            field=models.CharField(max_length=300),  # Changed from 200\n        ),\n        \n        # Reversible: AddIndex automatically generates RemoveIndex for reverse\n        migrations.AddIndex(\n            model_name='post',\n            index=models.Index(fields=['view_count'], name='blog_post_view_count_idx'),\n        ),\n    ]\n\n# Migration with custom reverse operations\nclass Migration(migrations.Migration):\n    \"\"\"Migration with custom reverse logic\"\"\"\n    \n    dependencies = [\n        ('blog', '0004_add_view_count'),\n    ]\n    \n    operations = [\n        # Custom SQL with explicit reverse\n        migrations.RunSQL(\n            sql=\"CREATE INDEX CONCURRENTLY idx_post_title_gin ON blog_post USING gin(to_tsvector('english', title));\",\n            reverse_sql=\"DROP INDEX IF EXISTS idx_post_title_gin;\",\n        ),\n        \n        # Python operation with custom reverse\n        migrations.RunPython(\n            code=populate_post_slugs,\n            reverse_code=clear_post_slugs,\n        ),\n    ]\n\ndef populate_post_slugs(apps, schema_editor):\n    \"\"\"Forward operation: populate slug fields\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    for post in Post.objects.filter(slug__isnull=True):\n        post.slug = slugify(post.title)\n        post.save()\n\ndef clear_post_slugs(apps, schema_editor):\n    \"\"\"Reverse operation: clear slug fields\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    # Clear slugs that were auto-generated\n    Post.objects.filter(slug__isnull=False).update(slug=None)\n\n# Non-reversible operations\nclass Migration(migrations.Migration):\n    \"\"\"Migration with non-reversible operations\"\"\"\n    \n    dependencies = [\n        ('blog', '0005_populate_slugs'),\n    ]\n    \n    operations = [\n        # This operation cannot be reversed safely\n        migrations.RemoveField(\n            model_name='post',\n            name='old_content_field',\n        ),\n        \n        # Custom operation marked as irreversible\n        migrations.RunPython(\n            code=migrate_complex_data,\n            reverse_code=migrations.RunPython.noop,  # No reverse operation\n        ),\n        \n        # SQL operation without reverse\n        migrations.RunSQL(\n            sql=\"DROP TABLE IF EXISTS legacy_table;\",\n            # No reverse_sql provided - irreversible\n        ),\n    ]\n\ndef migrate_complex_data(apps, schema_editor):\n    \"\"\"Complex data migration that cannot be easily reversed\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    # Complex transformation that loses original data structure\n    for post in Post.objects.all():\n        # Transform data in a way that original cannot be recovered\n        post.content = transform_content_irreversibly(post.content)\n        post.save()\n","python","",[1047,1048,1049,1058,1065,1071,1077,1082,1088,1094,1099,1105,1111,1116,1122,1150,1164,1171,1183,1213,1219,1224,1234,1240,1255,1274,1291,1320,1326,1332,1338,1350,1365,1381,1411,1416,1421,1427,1439,1454,1500,1505,1510,1515,1521,1538,1548,1553,1562,1584,1589,1594,1603,1609,1621,1639,1656,1661,1666,1672,1684,1697,1710,1715,1720,1725,1748,1758,1794,1799,1839,1866,1879,1884,1902,1912,1943,1948,1954,1994,1999,2005,2022,2032,2037,2046,2068,2073,2078,2087,2093,2105,2120,2136,2141,2146,2152,2163,2175,2198,2203,2208,2214,2225,2241,2247,2252,2257,2262,2280,2290,2321,2326,2332,2355,2361,2386],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Basic migration rollback commands\n",[1050,1059,1061],{"class":1052,"line":1060},2,[1050,1062,1064],{"emptyLinePlaceholder":1063},true,"\n",[1050,1066,1068],{"class":1052,"line":1067},3,[1050,1069,1070],{"class":1056},"# Rollback to a specific migration\n",[1050,1072,1074],{"class":1052,"line":1073},4,[1050,1075,1076],{"class":1056},"# python manage.py migrate blog 0003\n",[1050,1078,1080],{"class":1052,"line":1079},5,[1050,1081,1064],{"emptyLinePlaceholder":1063},[1050,1083,1085],{"class":1052,"line":1084},6,[1050,1086,1087],{"class":1056},"# Rollback all migrations for an app\n",[1050,1089,1091],{"class":1052,"line":1090},7,[1050,1092,1093],{"class":1056},"# python manage.py migrate blog zero\n",[1050,1095,1097],{"class":1052,"line":1096},8,[1050,1098,1064],{"emptyLinePlaceholder":1063},[1050,1100,1102],{"class":1052,"line":1101},9,[1050,1103,1104],{"class":1056},"# Show what would be rolled back without applying\n",[1050,1106,1108],{"class":1052,"line":1107},10,[1050,1109,1110],{"class":1056},"# python manage.py migrate blog 0003 --plan\n",[1050,1112,1114],{"class":1052,"line":1113},11,[1050,1115,1064],{"emptyLinePlaceholder":1063},[1050,1117,1119],{"class":1052,"line":1118},12,[1050,1120,1121],{"class":1056},"# Example migration with proper reverse operations\n",[1050,1123,1125,1129,1133,1137,1141,1144,1147],{"class":1052,"line":1124},13,[1050,1126,1128],{"class":1127},"s5Kfy","class",[1050,1130,1132],{"class":1131},"sD-vU"," Migration",[1050,1134,1136],{"class":1135},"soVBu","(",[1050,1138,1140],{"class":1139},"sYn-s","migrations",[1050,1142,1143],{"class":1135},".",[1050,1145,1146],{"class":1139},"Migration",[1050,1148,1149],{"class":1135},"):\n",[1050,1151,1153,1157,1161],{"class":1052,"line":1152},14,[1050,1154,1156],{"class":1155},"sm7ve","    \"\"\"",[1050,1158,1160],{"class":1159},"sVyVU","Migration with reversible operations",[1050,1162,1163],{"class":1155},"\"\"\"\n",[1050,1165,1167],{"class":1052,"line":1166},15,[1050,1168,1170],{"class":1169},"sftqT","    \n",[1050,1172,1174,1177,1180],{"class":1052,"line":1173},16,[1050,1175,1176],{"class":1169},"    dependencies ",[1050,1178,1179],{"class":1135},"=",[1050,1181,1182],{"class":1135}," [\n",[1050,1184,1186,1189,1193,1197,1199,1202,1205,1208,1210],{"class":1052,"line":1185},17,[1050,1187,1188],{"class":1135},"        (",[1050,1190,1192],{"class":1191},"sbYkP","'",[1050,1194,1196],{"class":1195},"sTbE_","blog",[1050,1198,1192],{"class":1191},[1050,1200,1201],{"class":1135},",",[1050,1203,1204],{"class":1191}," '",[1050,1206,1207],{"class":1195},"0003_add_tags",[1050,1209,1192],{"class":1191},[1050,1211,1212],{"class":1135},"),\n",[1050,1214,1216],{"class":1052,"line":1215},18,[1050,1217,1218],{"class":1135},"    ]\n",[1050,1220,1222],{"class":1052,"line":1221},19,[1050,1223,1170],{"class":1169},[1050,1225,1227,1230,1232],{"class":1052,"line":1226},20,[1050,1228,1229],{"class":1169},"    operations ",[1050,1231,1179],{"class":1135},[1050,1233,1182],{"class":1135},[1050,1235,1237],{"class":1052,"line":1236},21,[1050,1238,1239],{"class":1056},"        # Reversible: AddField automatically generates RemoveField for reverse\n",[1050,1241,1243,1246,1248,1252],{"class":1052,"line":1242},22,[1050,1244,1245],{"class":1169},"        migrations",[1050,1247,1143],{"class":1135},[1050,1249,1251],{"class":1250},"siWMO","AddField",[1050,1253,1254],{"class":1135},"(\n",[1050,1256,1258,1262,1264,1266,1269,1271],{"class":1052,"line":1257},23,[1050,1259,1261],{"class":1260},"sqOPj","            model_name",[1050,1263,1179],{"class":1135},[1050,1265,1192],{"class":1191},[1050,1267,1268],{"class":1195},"post",[1050,1270,1192],{"class":1191},[1050,1272,1273],{"class":1135},",\n",[1050,1275,1277,1280,1282,1284,1287,1289],{"class":1052,"line":1276},24,[1050,1278,1279],{"class":1260},"            name",[1050,1281,1179],{"class":1135},[1050,1283,1192],{"class":1191},[1050,1285,1286],{"class":1195},"view_count",[1050,1288,1192],{"class":1191},[1050,1290,1273],{"class":1135},[1050,1292,1294,1297,1299,1302,1304,1307,1309,1312,1314,1318],{"class":1052,"line":1293},25,[1050,1295,1296],{"class":1260},"            field",[1050,1298,1179],{"class":1135},[1050,1300,1301],{"class":1250},"models",[1050,1303,1143],{"class":1135},[1050,1305,1306],{"class":1250},"PositiveIntegerField",[1050,1308,1136],{"class":1135},[1050,1310,1311],{"class":1260},"default",[1050,1313,1179],{"class":1135},[1050,1315,1317],{"class":1316},"s7CZa","0",[1050,1319,1212],{"class":1135},[1050,1321,1323],{"class":1052,"line":1322},26,[1050,1324,1325],{"class":1135},"        ),\n",[1050,1327,1329],{"class":1052,"line":1328},27,[1050,1330,1331],{"class":1169},"        \n",[1050,1333,1335],{"class":1052,"line":1334},28,[1050,1336,1337],{"class":1056},"        # Reversible: AlterField can be reversed to previous state\n",[1050,1339,1341,1343,1345,1348],{"class":1052,"line":1340},29,[1050,1342,1245],{"class":1169},[1050,1344,1143],{"class":1135},[1050,1346,1347],{"class":1250},"AlterField",[1050,1349,1254],{"class":1135},[1050,1351,1353,1355,1357,1359,1361,1363],{"class":1052,"line":1352},30,[1050,1354,1261],{"class":1260},[1050,1356,1179],{"class":1135},[1050,1358,1192],{"class":1191},[1050,1360,1268],{"class":1195},[1050,1362,1192],{"class":1191},[1050,1364,1273],{"class":1135},[1050,1366,1368,1370,1372,1374,1377,1379],{"class":1052,"line":1367},31,[1050,1369,1279],{"class":1260},[1050,1371,1179],{"class":1135},[1050,1373,1192],{"class":1191},[1050,1375,1376],{"class":1195},"title",[1050,1378,1192],{"class":1191},[1050,1380,1273],{"class":1135},[1050,1382,1384,1386,1388,1390,1392,1395,1397,1400,1402,1405,1408],{"class":1052,"line":1383},32,[1050,1385,1296],{"class":1260},[1050,1387,1179],{"class":1135},[1050,1389,1301],{"class":1250},[1050,1391,1143],{"class":1135},[1050,1393,1394],{"class":1250},"CharField",[1050,1396,1136],{"class":1135},[1050,1398,1399],{"class":1260},"max_length",[1050,1401,1179],{"class":1135},[1050,1403,1404],{"class":1316},"300",[1050,1406,1407],{"class":1135},"),",[1050,1409,1410],{"class":1056},"  # Changed from 200\n",[1050,1412,1414],{"class":1052,"line":1413},33,[1050,1415,1325],{"class":1135},[1050,1417,1419],{"class":1052,"line":1418},34,[1050,1420,1331],{"class":1169},[1050,1422,1424],{"class":1052,"line":1423},35,[1050,1425,1426],{"class":1056},"        # Reversible: AddIndex automatically generates RemoveIndex for reverse\n",[1050,1428,1430,1432,1434,1437],{"class":1052,"line":1429},36,[1050,1431,1245],{"class":1169},[1050,1433,1143],{"class":1135},[1050,1435,1436],{"class":1250},"AddIndex",[1050,1438,1254],{"class":1135},[1050,1440,1442,1444,1446,1448,1450,1452],{"class":1052,"line":1441},37,[1050,1443,1261],{"class":1260},[1050,1445,1179],{"class":1135},[1050,1447,1192],{"class":1191},[1050,1449,1268],{"class":1195},[1050,1451,1192],{"class":1191},[1050,1453,1273],{"class":1135},[1050,1455,1457,1460,1462,1464,1466,1469,1471,1474,1477,1479,1481,1483,1486,1489,1491,1493,1496,1498],{"class":1052,"line":1456},38,[1050,1458,1459],{"class":1260},"            index",[1050,1461,1179],{"class":1135},[1050,1463,1301],{"class":1250},[1050,1465,1143],{"class":1135},[1050,1467,1468],{"class":1250},"Index",[1050,1470,1136],{"class":1135},[1050,1472,1473],{"class":1260},"fields",[1050,1475,1476],{"class":1135},"=[",[1050,1478,1192],{"class":1191},[1050,1480,1286],{"class":1195},[1050,1482,1192],{"class":1191},[1050,1484,1485],{"class":1135},"],",[1050,1487,1488],{"class":1260}," name",[1050,1490,1179],{"class":1135},[1050,1492,1192],{"class":1191},[1050,1494,1495],{"class":1195},"blog_post_view_count_idx",[1050,1497,1192],{"class":1191},[1050,1499,1212],{"class":1135},[1050,1501,1503],{"class":1052,"line":1502},39,[1050,1504,1325],{"class":1135},[1050,1506,1508],{"class":1052,"line":1507},40,[1050,1509,1218],{"class":1135},[1050,1511,1513],{"class":1052,"line":1512},41,[1050,1514,1064],{"emptyLinePlaceholder":1063},[1050,1516,1518],{"class":1052,"line":1517},42,[1050,1519,1520],{"class":1056},"# Migration with custom reverse operations\n",[1050,1522,1524,1526,1528,1530,1532,1534,1536],{"class":1052,"line":1523},43,[1050,1525,1128],{"class":1127},[1050,1527,1132],{"class":1131},[1050,1529,1136],{"class":1135},[1050,1531,1140],{"class":1139},[1050,1533,1143],{"class":1135},[1050,1535,1146],{"class":1139},[1050,1537,1149],{"class":1135},[1050,1539,1541,1543,1546],{"class":1052,"line":1540},44,[1050,1542,1156],{"class":1155},[1050,1544,1545],{"class":1159},"Migration with custom reverse logic",[1050,1547,1163],{"class":1155},[1050,1549,1551],{"class":1052,"line":1550},45,[1050,1552,1170],{"class":1169},[1050,1554,1556,1558,1560],{"class":1052,"line":1555},46,[1050,1557,1176],{"class":1169},[1050,1559,1179],{"class":1135},[1050,1561,1182],{"class":1135},[1050,1563,1565,1567,1569,1571,1573,1575,1577,1580,1582],{"class":1052,"line":1564},47,[1050,1566,1188],{"class":1135},[1050,1568,1192],{"class":1191},[1050,1570,1196],{"class":1195},[1050,1572,1192],{"class":1191},[1050,1574,1201],{"class":1135},[1050,1576,1204],{"class":1191},[1050,1578,1579],{"class":1195},"0004_add_view_count",[1050,1581,1192],{"class":1191},[1050,1583,1212],{"class":1135},[1050,1585,1587],{"class":1052,"line":1586},48,[1050,1588,1218],{"class":1135},[1050,1590,1592],{"class":1052,"line":1591},49,[1050,1593,1170],{"class":1169},[1050,1595,1597,1599,1601],{"class":1052,"line":1596},50,[1050,1598,1229],{"class":1169},[1050,1600,1179],{"class":1135},[1050,1602,1182],{"class":1135},[1050,1604,1606],{"class":1052,"line":1605},51,[1050,1607,1608],{"class":1056},"        # Custom SQL with explicit reverse\n",[1050,1610,1612,1614,1616,1619],{"class":1052,"line":1611},52,[1050,1613,1245],{"class":1169},[1050,1615,1143],{"class":1135},[1050,1617,1618],{"class":1250},"RunSQL",[1050,1620,1254],{"class":1135},[1050,1622,1624,1627,1629,1632,1635,1637],{"class":1052,"line":1623},53,[1050,1625,1626],{"class":1260},"            sql",[1050,1628,1179],{"class":1135},[1050,1630,1631],{"class":1191},"\"",[1050,1633,1634],{"class":1195},"CREATE INDEX CONCURRENTLY idx_post_title_gin ON blog_post USING gin(to_tsvector('english', title));",[1050,1636,1631],{"class":1191},[1050,1638,1273],{"class":1135},[1050,1640,1642,1645,1647,1649,1652,1654],{"class":1052,"line":1641},54,[1050,1643,1644],{"class":1260},"            reverse_sql",[1050,1646,1179],{"class":1135},[1050,1648,1631],{"class":1191},[1050,1650,1651],{"class":1195},"DROP INDEX IF EXISTS idx_post_title_gin;",[1050,1653,1631],{"class":1191},[1050,1655,1273],{"class":1135},[1050,1657,1659],{"class":1052,"line":1658},55,[1050,1660,1325],{"class":1135},[1050,1662,1664],{"class":1052,"line":1663},56,[1050,1665,1331],{"class":1169},[1050,1667,1669],{"class":1052,"line":1668},57,[1050,1670,1671],{"class":1056},"        # Python operation with custom reverse\n",[1050,1673,1675,1677,1679,1682],{"class":1052,"line":1674},58,[1050,1676,1245],{"class":1169},[1050,1678,1143],{"class":1135},[1050,1680,1681],{"class":1250},"RunPython",[1050,1683,1254],{"class":1135},[1050,1685,1687,1690,1692,1695],{"class":1052,"line":1686},59,[1050,1688,1689],{"class":1260},"            code",[1050,1691,1179],{"class":1135},[1050,1693,1694],{"class":1250},"populate_post_slugs",[1050,1696,1273],{"class":1135},[1050,1698,1700,1703,1705,1708],{"class":1052,"line":1699},60,[1050,1701,1702],{"class":1260},"            reverse_code",[1050,1704,1179],{"class":1135},[1050,1706,1707],{"class":1250},"clear_post_slugs",[1050,1709,1273],{"class":1135},[1050,1711,1713],{"class":1052,"line":1712},61,[1050,1714,1325],{"class":1135},[1050,1716,1718],{"class":1052,"line":1717},62,[1050,1719,1218],{"class":1135},[1050,1721,1723],{"class":1052,"line":1722},63,[1050,1724,1064],{"emptyLinePlaceholder":1063},[1050,1726,1728,1731,1735,1737,1741,1743,1746],{"class":1052,"line":1727},64,[1050,1729,1730],{"class":1127},"def",[1050,1732,1734],{"class":1733},"sljsM"," populate_post_slugs",[1050,1736,1136],{"class":1135},[1050,1738,1740],{"class":1739},"sCyAa","apps",[1050,1742,1201],{"class":1135},[1050,1744,1745],{"class":1739}," schema_editor",[1050,1747,1149],{"class":1135},[1050,1749,1751,1753,1756],{"class":1052,"line":1750},65,[1050,1752,1156],{"class":1155},[1050,1754,1755],{"class":1159},"Forward operation: populate slug fields",[1050,1757,1163],{"class":1155},[1050,1759,1761,1764,1766,1769,1771,1774,1776,1778,1780,1782,1784,1786,1789,1791],{"class":1052,"line":1760},66,[1050,1762,1763],{"class":1169},"    Post ",[1050,1765,1179],{"class":1135},[1050,1767,1768],{"class":1169}," apps",[1050,1770,1143],{"class":1135},[1050,1772,1773],{"class":1250},"get_model",[1050,1775,1136],{"class":1135},[1050,1777,1192],{"class":1191},[1050,1779,1196],{"class":1195},[1050,1781,1192],{"class":1191},[1050,1783,1201],{"class":1135},[1050,1785,1204],{"class":1191},[1050,1787,1788],{"class":1195},"Post",[1050,1790,1192],{"class":1191},[1050,1792,1793],{"class":1135},")\n",[1050,1795,1797],{"class":1052,"line":1796},67,[1050,1798,1170],{"class":1169},[1050,1800,1802,1806,1809,1812,1815,1817,1821,1823,1826,1828,1831,1833,1837],{"class":1052,"line":1801},68,[1050,1803,1805],{"class":1804},"siDh9","    for",[1050,1807,1808],{"class":1169}," post ",[1050,1810,1811],{"class":1804},"in",[1050,1813,1814],{"class":1169}," Post",[1050,1816,1143],{"class":1135},[1050,1818,1820],{"class":1819},"sBPpx","objects",[1050,1822,1143],{"class":1135},[1050,1824,1825],{"class":1250},"filter",[1050,1827,1136],{"class":1135},[1050,1829,1830],{"class":1260},"slug__isnull",[1050,1832,1179],{"class":1135},[1050,1834,1836],{"class":1835},"s8XtY","True",[1050,1838,1149],{"class":1135},[1050,1840,1842,1845,1847,1850,1853,1856,1858,1860,1862,1864],{"class":1052,"line":1841},69,[1050,1843,1844],{"class":1169},"        post",[1050,1846,1143],{"class":1135},[1050,1848,1849],{"class":1819},"slug",[1050,1851,1852],{"class":1135}," =",[1050,1854,1855],{"class":1250}," slugify",[1050,1857,1136],{"class":1135},[1050,1859,1268],{"class":1250},[1050,1861,1143],{"class":1135},[1050,1863,1376],{"class":1819},[1050,1865,1793],{"class":1135},[1050,1867,1869,1871,1873,1876],{"class":1052,"line":1868},70,[1050,1870,1844],{"class":1169},[1050,1872,1143],{"class":1135},[1050,1874,1875],{"class":1250},"save",[1050,1877,1878],{"class":1135},"()\n",[1050,1880,1882],{"class":1052,"line":1881},71,[1050,1883,1064],{"emptyLinePlaceholder":1063},[1050,1885,1887,1889,1892,1894,1896,1898,1900],{"class":1052,"line":1886},72,[1050,1888,1730],{"class":1127},[1050,1890,1891],{"class":1733}," clear_post_slugs",[1050,1893,1136],{"class":1135},[1050,1895,1740],{"class":1739},[1050,1897,1201],{"class":1135},[1050,1899,1745],{"class":1739},[1050,1901,1149],{"class":1135},[1050,1903,1905,1907,1910],{"class":1052,"line":1904},73,[1050,1906,1156],{"class":1155},[1050,1908,1909],{"class":1159},"Reverse operation: clear slug fields",[1050,1911,1163],{"class":1155},[1050,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941],{"class":1052,"line":1914},74,[1050,1916,1763],{"class":1169},[1050,1918,1179],{"class":1135},[1050,1920,1768],{"class":1169},[1050,1922,1143],{"class":1135},[1050,1924,1773],{"class":1250},[1050,1926,1136],{"class":1135},[1050,1928,1192],{"class":1191},[1050,1930,1196],{"class":1195},[1050,1932,1192],{"class":1191},[1050,1934,1201],{"class":1135},[1050,1936,1204],{"class":1191},[1050,1938,1788],{"class":1195},[1050,1940,1192],{"class":1191},[1050,1942,1793],{"class":1135},[1050,1944,1946],{"class":1052,"line":1945},75,[1050,1947,1170],{"class":1169},[1050,1949,1951],{"class":1052,"line":1950},76,[1050,1952,1953],{"class":1056},"    # Clear slugs that were auto-generated\n",[1050,1955,1957,1960,1962,1964,1966,1968,1970,1972,1974,1977,1980,1983,1985,1987,1989,1992],{"class":1052,"line":1956},77,[1050,1958,1959],{"class":1169},"    Post",[1050,1961,1143],{"class":1135},[1050,1963,1820],{"class":1819},[1050,1965,1143],{"class":1135},[1050,1967,1825],{"class":1250},[1050,1969,1136],{"class":1135},[1050,1971,1830],{"class":1260},[1050,1973,1179],{"class":1135},[1050,1975,1976],{"class":1835},"False",[1050,1978,1979],{"class":1135},").",[1050,1981,1982],{"class":1250},"update",[1050,1984,1136],{"class":1135},[1050,1986,1849],{"class":1260},[1050,1988,1179],{"class":1135},[1050,1990,1991],{"class":1835},"None",[1050,1993,1793],{"class":1135},[1050,1995,1997],{"class":1052,"line":1996},78,[1050,1998,1064],{"emptyLinePlaceholder":1063},[1050,2000,2002],{"class":1052,"line":2001},79,[1050,2003,2004],{"class":1056},"# Non-reversible operations\n",[1050,2006,2008,2010,2012,2014,2016,2018,2020],{"class":1052,"line":2007},80,[1050,2009,1128],{"class":1127},[1050,2011,1132],{"class":1131},[1050,2013,1136],{"class":1135},[1050,2015,1140],{"class":1139},[1050,2017,1143],{"class":1135},[1050,2019,1146],{"class":1139},[1050,2021,1149],{"class":1135},[1050,2023,2025,2027,2030],{"class":1052,"line":2024},81,[1050,2026,1156],{"class":1155},[1050,2028,2029],{"class":1159},"Migration with non-reversible operations",[1050,2031,1163],{"class":1155},[1050,2033,2035],{"class":1052,"line":2034},82,[1050,2036,1170],{"class":1169},[1050,2038,2040,2042,2044],{"class":1052,"line":2039},83,[1050,2041,1176],{"class":1169},[1050,2043,1179],{"class":1135},[1050,2045,1182],{"class":1135},[1050,2047,2049,2051,2053,2055,2057,2059,2061,2064,2066],{"class":1052,"line":2048},84,[1050,2050,1188],{"class":1135},[1050,2052,1192],{"class":1191},[1050,2054,1196],{"class":1195},[1050,2056,1192],{"class":1191},[1050,2058,1201],{"class":1135},[1050,2060,1204],{"class":1191},[1050,2062,2063],{"class":1195},"0005_populate_slugs",[1050,2065,1192],{"class":1191},[1050,2067,1212],{"class":1135},[1050,2069,2071],{"class":1052,"line":2070},85,[1050,2072,1218],{"class":1135},[1050,2074,2076],{"class":1052,"line":2075},86,[1050,2077,1170],{"class":1169},[1050,2079,2081,2083,2085],{"class":1052,"line":2080},87,[1050,2082,1229],{"class":1169},[1050,2084,1179],{"class":1135},[1050,2086,1182],{"class":1135},[1050,2088,2090],{"class":1052,"line":2089},88,[1050,2091,2092],{"class":1056},"        # This operation cannot be reversed safely\n",[1050,2094,2096,2098,2100,2103],{"class":1052,"line":2095},89,[1050,2097,1245],{"class":1169},[1050,2099,1143],{"class":1135},[1050,2101,2102],{"class":1250},"RemoveField",[1050,2104,1254],{"class":1135},[1050,2106,2108,2110,2112,2114,2116,2118],{"class":1052,"line":2107},90,[1050,2109,1261],{"class":1260},[1050,2111,1179],{"class":1135},[1050,2113,1192],{"class":1191},[1050,2115,1268],{"class":1195},[1050,2117,1192],{"class":1191},[1050,2119,1273],{"class":1135},[1050,2121,2123,2125,2127,2129,2132,2134],{"class":1052,"line":2122},91,[1050,2124,1279],{"class":1260},[1050,2126,1179],{"class":1135},[1050,2128,1192],{"class":1191},[1050,2130,2131],{"class":1195},"old_content_field",[1050,2133,1192],{"class":1191},[1050,2135,1273],{"class":1135},[1050,2137,2139],{"class":1052,"line":2138},92,[1050,2140,1325],{"class":1135},[1050,2142,2144],{"class":1052,"line":2143},93,[1050,2145,1331],{"class":1169},[1050,2147,2149],{"class":1052,"line":2148},94,[1050,2150,2151],{"class":1056},"        # Custom operation marked as irreversible\n",[1050,2153,2155,2157,2159,2161],{"class":1052,"line":2154},95,[1050,2156,1245],{"class":1169},[1050,2158,1143],{"class":1135},[1050,2160,1681],{"class":1250},[1050,2162,1254],{"class":1135},[1050,2164,2166,2168,2170,2173],{"class":1052,"line":2165},96,[1050,2167,1689],{"class":1260},[1050,2169,1179],{"class":1135},[1050,2171,2172],{"class":1250},"migrate_complex_data",[1050,2174,1273],{"class":1135},[1050,2176,2178,2180,2182,2184,2186,2188,2190,2193,2195],{"class":1052,"line":2177},97,[1050,2179,1702],{"class":1260},[1050,2181,1179],{"class":1135},[1050,2183,1140],{"class":1250},[1050,2185,1143],{"class":1135},[1050,2187,1681],{"class":1819},[1050,2189,1143],{"class":1135},[1050,2191,2192],{"class":1819},"noop",[1050,2194,1201],{"class":1135},[1050,2196,2197],{"class":1056},"  # No reverse operation\n",[1050,2199,2201],{"class":1052,"line":2200},98,[1050,2202,1325],{"class":1135},[1050,2204,2206],{"class":1052,"line":2205},99,[1050,2207,1331],{"class":1169},[1050,2209,2211],{"class":1052,"line":2210},100,[1050,2212,2213],{"class":1056},"        # SQL operation without reverse\n",[1050,2215,2217,2219,2221,2223],{"class":1052,"line":2216},101,[1050,2218,1245],{"class":1169},[1050,2220,1143],{"class":1135},[1050,2222,1618],{"class":1250},[1050,2224,1254],{"class":1135},[1050,2226,2228,2230,2232,2234,2237,2239],{"class":1052,"line":2227},102,[1050,2229,1626],{"class":1260},[1050,2231,1179],{"class":1135},[1050,2233,1631],{"class":1191},[1050,2235,2236],{"class":1195},"DROP TABLE IF EXISTS legacy_table;",[1050,2238,1631],{"class":1191},[1050,2240,1273],{"class":1135},[1050,2242,2244],{"class":1052,"line":2243},103,[1050,2245,2246],{"class":1056},"            # No reverse_sql provided - irreversible\n",[1050,2248,2250],{"class":1052,"line":2249},104,[1050,2251,1325],{"class":1135},[1050,2253,2255],{"class":1052,"line":2254},105,[1050,2256,1218],{"class":1135},[1050,2258,2260],{"class":1052,"line":2259},106,[1050,2261,1064],{"emptyLinePlaceholder":1063},[1050,2263,2265,2267,2270,2272,2274,2276,2278],{"class":1052,"line":2264},107,[1050,2266,1730],{"class":1127},[1050,2268,2269],{"class":1733}," migrate_complex_data",[1050,2271,1136],{"class":1135},[1050,2273,1740],{"class":1739},[1050,2275,1201],{"class":1135},[1050,2277,1745],{"class":1739},[1050,2279,1149],{"class":1135},[1050,2281,2283,2285,2288],{"class":1052,"line":2282},108,[1050,2284,1156],{"class":1155},[1050,2286,2287],{"class":1159},"Complex data migration that cannot be easily reversed",[1050,2289,1163],{"class":1155},[1050,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319],{"class":1052,"line":2292},109,[1050,2294,1763],{"class":1169},[1050,2296,1179],{"class":1135},[1050,2298,1768],{"class":1169},[1050,2300,1143],{"class":1135},[1050,2302,1773],{"class":1250},[1050,2304,1136],{"class":1135},[1050,2306,1192],{"class":1191},[1050,2308,1196],{"class":1195},[1050,2310,1192],{"class":1191},[1050,2312,1201],{"class":1135},[1050,2314,1204],{"class":1191},[1050,2316,1788],{"class":1195},[1050,2318,1192],{"class":1191},[1050,2320,1793],{"class":1135},[1050,2322,2324],{"class":1052,"line":2323},110,[1050,2325,1170],{"class":1169},[1050,2327,2329],{"class":1052,"line":2328},111,[1050,2330,2331],{"class":1056},"    # Complex transformation that loses original data structure\n",[1050,2333,2335,2337,2339,2341,2343,2345,2347,2349,2352],{"class":1052,"line":2334},112,[1050,2336,1805],{"class":1804},[1050,2338,1808],{"class":1169},[1050,2340,1811],{"class":1804},[1050,2342,1814],{"class":1169},[1050,2344,1143],{"class":1135},[1050,2346,1820],{"class":1819},[1050,2348,1143],{"class":1135},[1050,2350,2351],{"class":1250},"all",[1050,2353,2354],{"class":1135},"():\n",[1050,2356,2358],{"class":1052,"line":2357},113,[1050,2359,2360],{"class":1056},"        # Transform data in a way that original cannot be recovered\n",[1050,2362,2364,2366,2368,2371,2373,2376,2378,2380,2382,2384],{"class":1052,"line":2363},114,[1050,2365,1844],{"class":1169},[1050,2367,1143],{"class":1135},[1050,2369,2370],{"class":1819},"content",[1050,2372,1852],{"class":1135},[1050,2374,2375],{"class":1250}," transform_content_irreversibly",[1050,2377,1136],{"class":1135},[1050,2379,1268],{"class":1250},[1050,2381,1143],{"class":1135},[1050,2383,2370],{"class":1819},[1050,2385,1793],{"class":1135},[1050,2387,2389,2391,2393,2395],{"class":1052,"line":2388},115,[1050,2390,1844],{"class":1169},[1050,2392,1143],{"class":1135},[1050,2394,1875],{"class":1250},[1050,2396,1878],{"class":1135},[1035,2398,2400],{"id":2399},"rollback-safety-analysis","Rollback Safety Analysis",[1040,2402,2404],{"className":1042,"code":2403,"language":1044,"meta":1045,"style":1045},"class RollbackSafetyAnalyzer:\n    \"\"\"Analyze migration rollback safety\"\"\"\n    \n    def __init__(self):\n        from django.db.migrations.loader import MigrationLoader\n        self.loader = MigrationLoader(connection)\n    \n    def analyze_rollback_safety(self, app_label, target_migration):\n        \"\"\"Analyze safety of rolling back to a specific migration\"\"\"\n        \n        current_state = self.loader.project_state()\n        target_key = (app_label, target_migration)\n        \n        if target_key not in self.loader.graph.nodes:\n            return {\n                'safe': False,\n                'error': f\"Migration {app_label}.{target_migration} not found\"\n            }\n        \n        # Get rollback plan\n        from django.db.migrations.executor import MigrationExecutor\n        executor = MigrationExecutor(connection)\n        \n        try:\n            plan = executor.migration_plan([target_key])\n        except Exception as e:\n            return {\n                'safe': False,\n                'error': f\"Cannot create rollback plan: {e}\"\n            }\n        \n        safety_analysis = {\n            'safe': True,\n            'warnings': [],\n            'data_loss_risk': False,\n            'irreversible_operations': [],\n            'affected_tables': set(),\n            'rollback_plan': []\n        }\n        \n        # Analyze each migration in rollback plan\n        for migration, backwards in plan:\n            if not backwards:\n                continue  # Skip forward migrations\n            \n            migration_analysis = self._analyze_migration_rollback(migration)\n            \n            safety_analysis['rollback_plan'].append({\n                'migration': f\"{migration.app_label}.{migration.name}\",\n                'analysis': migration_analysis\n            })\n            \n            # Aggregate risks\n            if not migration_analysis['reversible']:\n                safety_analysis['safe'] = False\n                safety_analysis['irreversible_operations'].extend(\n                    migration_analysis['irreversible_operations']\n                )\n            \n            if migration_analysis['data_loss_risk']:\n                safety_analysis['data_loss_risk'] = True\n            \n            safety_analysis['warnings'].extend(migration_analysis['warnings'])\n            safety_analysis['affected_tables'].update(migration_analysis['affected_tables'])\n        \n        return safety_analysis\n    \n    def _analyze_migration_rollback(self, migration):\n        \"\"\"Analyze rollback safety for a single migration\"\"\"\n        \n        analysis = {\n            'reversible': True,\n            'data_loss_risk': False,\n            'warnings': [],\n            'irreversible_operations': [],\n            'affected_tables': set()\n        }\n        \n        for operation in migration.operations:\n            op_analysis = self._analyze_operation_rollback(operation)\n            \n            if not op_analysis['reversible']:\n                analysis['reversible'] = False\n                analysis['irreversible_operations'].append(op_analysis)\n            \n            if op_analysis['data_loss_risk']:\n                analysis['data_loss_risk'] = True\n            \n            analysis['warnings'].extend(op_analysis['warnings'])\n            analysis['affected_tables'].update(op_analysis['affected_tables'])\n        \n        return analysis\n    \n    def _analyze_operation_rollback(self, operation):\n        \"\"\"Analyze rollback safety for a single operation\"\"\"\n        \n        op_name = operation.__class__.__name__\n        \n        analysis = {\n            'operation': op_name,\n            'reversible': True,\n            'data_loss_risk': False,\n            'warnings': [],\n            'affected_tables': set()\n        }\n        \n        # Analyze specific operation types\n        if op_name == 'CreateModel':\n            analysis['data_loss_risk'] = True\n            analysis['warnings'].append(\n                f\"Rolling back CreateModel will delete all data in {operation.name} table\"\n            )\n            analysis['affected_tables'].add(operation.name.lower())\n        \n        elif op_name == 'DeleteModel':\n            analysis['reversible'] = True  # DeleteModel rollback recreates table\n            analysis['warnings'].append(\n                f\"Rolling back DeleteModel will recreate {operation.name} table (data already lost)\"\n            )\n        \n        elif op_name == 'AddField':\n            analysis['data_loss_risk'] = True\n            analysis['warnings'].append(\n                f\"Rolling back AddField will delete data in {operation.name} field\"\n            )\n            if hasattr(operation, 'model_name'):\n                analysis['affected_tables'].add(operation.model_name.lower())\n        \n        elif op_name == 'RemoveField':\n            analysis['reversible'] = True  # RemoveField rollback recreates field\n            analysis['warnings'].append(\n                f\"Rolling back RemoveField will recreate {operation.name} field (data already lost)\"\n            )\n        \n        elif op_name == 'AlterField':\n            analysis['warnings'].append(\n                f\"Rolling back AlterField may cause data compatibility issues for {operation.name}\"\n            )\n            if hasattr(operation, 'model_name'):\n                analysis['affected_tables'].add(operation.model_name.lower())\n        \n        elif op_name == 'RunSQL':\n            if not hasattr(operation, 'reverse_sql') or not operation.reverse_sql:\n                analysis['reversible'] = False\n                analysis['irreversible_operations'].append(\n                    f\"RunSQL operation without reverse_sql\"\n                )\n            else:\n                analysis['warnings'].append(\n                    \"Custom SQL rollback - verify reverse_sql is correct\"\n                )\n        \n        elif op_name == 'RunPython':\n            if (not hasattr(operation, 'reverse_code') or \n                operation.reverse_code == migrations.RunPython.noop):\n                analysis['reversible'] = False\n                analysis['irreversible_operations'].append(\n                    f\"RunPython operation without reverse_code\"\n                )\n            else:\n                analysis['warnings'].append(\n                    \"Custom Python rollback - verify reverse_code is correct\"\n                )\n        \n        return analysis\n    \n    def suggest_rollback_strategy(self, app_label, target_migration):\n        \"\"\"Suggest strategy for safe rollback\"\"\"\n        \n        safety_analysis = self.analyze_rollback_safety(app_label, target_migration)\n        \n        strategy = {\n            'recommended_approach': 'direct_rollback',\n            'steps': [],\n            'prerequisites': [],\n            'risks': [],\n            'alternatives': []\n        }\n        \n        if not safety_analysis['safe']:\n            strategy['recommended_approach'] = 'manual_rollback'\n            strategy['steps'].extend([\n                \"1. Create database backup\",\n                \"2. Review irreversible operations manually\",\n                \"3. Create custom rollback migration if needed\",\n                \"4. Test rollback on copy of production data\"\n            ])\n        \n        elif safety_analysis['data_loss_risk']:\n            strategy['recommended_approach'] = 'backup_and_rollback'\n            strategy['prerequisites'].append(\"Create database backup\")\n            strategy['steps'].extend([\n                \"1. Backup database\",\n                \"2. Export affected data if needed\",\n                \"3. Perform rollback\",\n                \"4. Verify data integrity\"\n            ])\n        \n        else:\n            strategy['steps'].extend([\n                f\"1. Run: python manage.py migrate {app_label} {target_migration}\",\n                \"2. Verify application functionality\",\n                \"3. Check for any data inconsistencies\"\n            ])\n        \n        # Add risks from analysis\n        strategy['risks'] = safety_analysis['warnings']\n        \n        # Add alternative approaches\n        if safety_analysis['irreversible_operations']:\n            strategy['alternatives'].extend([\n                \"Create new forward migration to undo changes\",\n                \"Restore from backup instead of rollback\",\n                \"Manual database modifications\"\n            ])\n        \n        return strategy\n",[1047,2405,2406,2416,2425,2429,2446,2474,2497,2501,2524,2534,2538,2559,2578,2582,2615,2623,2641,2679,2684,2688,2693,2717,2733,2737,2744,2768,2785,2791,2805,2830,2834,2838,2847,2863,2877,2892,2905,2922,2936,2941,2945,2950,2970,2983,2991,2996,3017,3021,3044,3085,3099,3104,3108,3113,3134,3155,3174,3190,3195,3199,3215,3234,3238,3269,3299,3303,3311,3315,3332,3341,3345,3354,3368,3382,3394,3406,3420,3424,3428,3446,3467,3471,3490,3509,3532,3536,3552,3570,3574,3605,3635,3639,3646,3650,3668,3677,3681,3701,3705,3713,3728,3742,3756,3768,3782,3786,3790,3795,3814,3832,3850,3871,3876,3909,3913,3931,3953,3972,3993,3998,4003,4020,4039,4058,4079,4084,4107,4138,4143,4160,4182,4201,4222,4227,4232,4249,4268,4288,4293,4314,4345,4350,4367,4405,4424,4443,4452,4457,4465,4484,4495,4500,4505,4522,4553,4579,4598,4617,4625,4630,4637,4656,4666,4671,4676,4683,4688,4710,4720,4725,4749,4754,4764,4785,4799,4813,4827,4841,4846,4851,4871,4897,4917,4930,4942,4954,4964,4970,4975,4992,5016,5044,5063,5075,5087,5099,5109,5114,5119,5127,5146,5171,5183,5193,5198,5203,5209,5239,5244,5250,5267,5286,5298,5310,5320,5325,5330],{"__ignoreMap":1045},[1050,2407,2408,2410,2413],{"class":1052,"line":1053},[1050,2409,1128],{"class":1127},[1050,2411,2412],{"class":1131}," RollbackSafetyAnalyzer",[1050,2414,2415],{"class":1135},":\n",[1050,2417,2418,2420,2423],{"class":1052,"line":1060},[1050,2419,1156],{"class":1155},[1050,2421,2422],{"class":1159},"Analyze migration rollback safety",[1050,2424,1163],{"class":1155},[1050,2426,2427],{"class":1052,"line":1067},[1050,2428,1170],{"class":1169},[1050,2430,2431,2434,2438,2440,2444],{"class":1052,"line":1073},[1050,2432,2433],{"class":1127},"    def",[1050,2435,2437],{"class":2436},"sJdAF"," __init__",[1050,2439,1136],{"class":1135},[1050,2441,2443],{"class":2442},"sRjD_","self",[1050,2445,1149],{"class":1135},[1050,2447,2448,2451,2454,2456,2459,2461,2463,2465,2468,2471],{"class":1052,"line":1079},[1050,2449,2450],{"class":1804},"        from",[1050,2452,2453],{"class":1169}," django",[1050,2455,1143],{"class":1135},[1050,2457,2458],{"class":1169},"db",[1050,2460,1143],{"class":1135},[1050,2462,1140],{"class":1169},[1050,2464,1143],{"class":1135},[1050,2466,2467],{"class":1169},"loader ",[1050,2469,2470],{"class":1804},"import",[1050,2472,2473],{"class":1169}," MigrationLoader\n",[1050,2475,2476,2480,2482,2485,2487,2490,2492,2495],{"class":1052,"line":1084},[1050,2477,2479],{"class":2478},"se3Ec","        self",[1050,2481,1143],{"class":1135},[1050,2483,2484],{"class":1819},"loader",[1050,2486,1852],{"class":1135},[1050,2488,2489],{"class":1250}," MigrationLoader",[1050,2491,1136],{"class":1135},[1050,2493,2494],{"class":1250},"connection",[1050,2496,1793],{"class":1135},[1050,2498,2499],{"class":1052,"line":1090},[1050,2500,1170],{"class":1169},[1050,2502,2503,2505,2508,2510,2512,2514,2517,2519,2522],{"class":1052,"line":1096},[1050,2504,2433],{"class":1127},[1050,2506,2507],{"class":1733}," analyze_rollback_safety",[1050,2509,1136],{"class":1135},[1050,2511,2443],{"class":2442},[1050,2513,1201],{"class":1135},[1050,2515,2516],{"class":1739}," app_label",[1050,2518,1201],{"class":1135},[1050,2520,2521],{"class":1739}," target_migration",[1050,2523,1149],{"class":1135},[1050,2525,2526,2529,2532],{"class":1052,"line":1101},[1050,2527,2528],{"class":1155},"        \"\"\"",[1050,2530,2531],{"class":1159},"Analyze safety of rolling back to a specific migration",[1050,2533,1163],{"class":1155},[1050,2535,2536],{"class":1052,"line":1107},[1050,2537,1331],{"class":1169},[1050,2539,2540,2543,2545,2548,2550,2552,2554,2557],{"class":1052,"line":1113},[1050,2541,2542],{"class":1169},"        current_state ",[1050,2544,1179],{"class":1135},[1050,2546,2547],{"class":2478}," self",[1050,2549,1143],{"class":1135},[1050,2551,2484],{"class":1819},[1050,2553,1143],{"class":1135},[1050,2555,2556],{"class":1250},"project_state",[1050,2558,1878],{"class":1135},[1050,2560,2561,2564,2566,2569,2572,2574,2576],{"class":1052,"line":1118},[1050,2562,2563],{"class":1169},"        target_key ",[1050,2565,1179],{"class":1135},[1050,2567,2568],{"class":1135}," (",[1050,2570,2571],{"class":1169},"app_label",[1050,2573,1201],{"class":1135},[1050,2575,2521],{"class":1169},[1050,2577,1793],{"class":1135},[1050,2579,2580],{"class":1052,"line":1124},[1050,2581,1331],{"class":1169},[1050,2583,2584,2587,2590,2594,2597,2599,2601,2603,2605,2608,2610,2613],{"class":1052,"line":1152},[1050,2585,2586],{"class":1804},"        if",[1050,2588,2589],{"class":1169}," target_key ",[1050,2591,2593],{"class":2592},"sVsLi","not",[1050,2595,2596],{"class":2592}," in",[1050,2598,2547],{"class":2478},[1050,2600,1143],{"class":1135},[1050,2602,2484],{"class":1819},[1050,2604,1143],{"class":1135},[1050,2606,2607],{"class":1819},"graph",[1050,2609,1143],{"class":1135},[1050,2611,2612],{"class":1819},"nodes",[1050,2614,2415],{"class":1135},[1050,2616,2617,2620],{"class":1052,"line":1166},[1050,2618,2619],{"class":1804},"            return",[1050,2621,2622],{"class":1135}," {\n",[1050,2624,2625,2628,2631,2633,2636,2639],{"class":1052,"line":1173},[1050,2626,2627],{"class":1191},"                '",[1050,2629,2630],{"class":1195},"safe",[1050,2632,1192],{"class":1191},[1050,2634,2635],{"class":1135},":",[1050,2637,2638],{"class":1835}," False",[1050,2640,1273],{"class":1135},[1050,2642,2643,2645,2648,2650,2652,2655,2658,2662,2664,2667,2669,2671,2674,2676],{"class":1052,"line":1185},[1050,2644,2627],{"class":1191},[1050,2646,2647],{"class":1195},"error",[1050,2649,1192],{"class":1191},[1050,2651,2635],{"class":1135},[1050,2653,2654],{"class":1127}," f",[1050,2656,2657],{"class":1195},"\"Migration ",[1050,2659,2661],{"class":2660},"s3h35","{",[1050,2663,2571],{"class":1169},[1050,2665,2666],{"class":2660},"}",[1050,2668,1143],{"class":1195},[1050,2670,2661],{"class":2660},[1050,2672,2673],{"class":1169},"target_migration",[1050,2675,2666],{"class":2660},[1050,2677,2678],{"class":1195}," not found\"\n",[1050,2680,2681],{"class":1052,"line":1215},[1050,2682,2683],{"class":1135},"            }\n",[1050,2685,2686],{"class":1052,"line":1221},[1050,2687,1331],{"class":1169},[1050,2689,2690],{"class":1052,"line":1226},[1050,2691,2692],{"class":1056},"        # Get rollback plan\n",[1050,2694,2695,2697,2699,2701,2703,2705,2707,2709,2712,2714],{"class":1052,"line":1236},[1050,2696,2450],{"class":1804},[1050,2698,2453],{"class":1169},[1050,2700,1143],{"class":1135},[1050,2702,2458],{"class":1169},[1050,2704,1143],{"class":1135},[1050,2706,1140],{"class":1169},[1050,2708,1143],{"class":1135},[1050,2710,2711],{"class":1169},"executor ",[1050,2713,2470],{"class":1804},[1050,2715,2716],{"class":1169}," MigrationExecutor\n",[1050,2718,2719,2722,2724,2727,2729,2731],{"class":1052,"line":1242},[1050,2720,2721],{"class":1169},"        executor ",[1050,2723,1179],{"class":1135},[1050,2725,2726],{"class":1250}," MigrationExecutor",[1050,2728,1136],{"class":1135},[1050,2730,2494],{"class":1250},[1050,2732,1793],{"class":1135},[1050,2734,2735],{"class":1052,"line":1257},[1050,2736,1331],{"class":1169},[1050,2738,2739,2742],{"class":1052,"line":1276},[1050,2740,2741],{"class":1804},"        try",[1050,2743,2415],{"class":1135},[1050,2745,2746,2749,2751,2754,2756,2759,2762,2765],{"class":1052,"line":1293},[1050,2747,2748],{"class":1169},"            plan ",[1050,2750,1179],{"class":1135},[1050,2752,2753],{"class":1169}," executor",[1050,2755,1143],{"class":1135},[1050,2757,2758],{"class":1250},"migration_plan",[1050,2760,2761],{"class":1135},"([",[1050,2763,2764],{"class":1250},"target_key",[1050,2766,2767],{"class":1135},"])\n",[1050,2769,2770,2773,2777,2780,2783],{"class":1052,"line":1322},[1050,2771,2772],{"class":1804},"        except",[1050,2774,2776],{"class":2775},"sa2tF"," Exception",[1050,2778,2779],{"class":1804}," as",[1050,2781,2782],{"class":1169}," e",[1050,2784,2415],{"class":1135},[1050,2786,2787,2789],{"class":1052,"line":1328},[1050,2788,2619],{"class":1804},[1050,2790,2622],{"class":1135},[1050,2792,2793,2795,2797,2799,2801,2803],{"class":1052,"line":1334},[1050,2794,2627],{"class":1191},[1050,2796,2630],{"class":1195},[1050,2798,1192],{"class":1191},[1050,2800,2635],{"class":1135},[1050,2802,2638],{"class":1835},[1050,2804,1273],{"class":1135},[1050,2806,2807,2809,2811,2813,2815,2817,2820,2822,2825,2827],{"class":1052,"line":1340},[1050,2808,2627],{"class":1191},[1050,2810,2647],{"class":1195},[1050,2812,1192],{"class":1191},[1050,2814,2635],{"class":1135},[1050,2816,2654],{"class":1127},[1050,2818,2819],{"class":1195},"\"Cannot create rollback plan: ",[1050,2821,2661],{"class":2660},[1050,2823,2824],{"class":1169},"e",[1050,2826,2666],{"class":2660},[1050,2828,2829],{"class":1195},"\"\n",[1050,2831,2832],{"class":1052,"line":1352},[1050,2833,2683],{"class":1135},[1050,2835,2836],{"class":1052,"line":1367},[1050,2837,1331],{"class":1169},[1050,2839,2840,2843,2845],{"class":1052,"line":1383},[1050,2841,2842],{"class":1169},"        safety_analysis ",[1050,2844,1179],{"class":1135},[1050,2846,2622],{"class":1135},[1050,2848,2849,2852,2854,2856,2858,2861],{"class":1052,"line":1413},[1050,2850,2851],{"class":1191},"            '",[1050,2853,2630],{"class":1195},[1050,2855,1192],{"class":1191},[1050,2857,2635],{"class":1135},[1050,2859,2860],{"class":1835}," True",[1050,2862,1273],{"class":1135},[1050,2864,2865,2867,2870,2872,2874],{"class":1052,"line":1418},[1050,2866,2851],{"class":1191},[1050,2868,2869],{"class":1195},"warnings",[1050,2871,1192],{"class":1191},[1050,2873,2635],{"class":1135},[1050,2875,2876],{"class":1135}," [],\n",[1050,2878,2879,2881,2884,2886,2888,2890],{"class":1052,"line":1423},[1050,2880,2851],{"class":1191},[1050,2882,2883],{"class":1195},"data_loss_risk",[1050,2885,1192],{"class":1191},[1050,2887,2635],{"class":1135},[1050,2889,2638],{"class":1835},[1050,2891,1273],{"class":1135},[1050,2893,2894,2896,2899,2901,2903],{"class":1052,"line":1429},[1050,2895,2851],{"class":1191},[1050,2897,2898],{"class":1195},"irreversible_operations",[1050,2900,1192],{"class":1191},[1050,2902,2635],{"class":1135},[1050,2904,2876],{"class":1135},[1050,2906,2907,2909,2912,2914,2916,2919],{"class":1052,"line":1441},[1050,2908,2851],{"class":1191},[1050,2910,2911],{"class":1195},"affected_tables",[1050,2913,1192],{"class":1191},[1050,2915,2635],{"class":1135},[1050,2917,2918],{"class":2775}," set",[1050,2920,2921],{"class":1135},"(),\n",[1050,2923,2924,2926,2929,2931,2933],{"class":1052,"line":1456},[1050,2925,2851],{"class":1191},[1050,2927,2928],{"class":1195},"rollback_plan",[1050,2930,1192],{"class":1191},[1050,2932,2635],{"class":1135},[1050,2934,2935],{"class":1135}," []\n",[1050,2937,2938],{"class":1052,"line":1502},[1050,2939,2940],{"class":1135},"        }\n",[1050,2942,2943],{"class":1052,"line":1507},[1050,2944,1331],{"class":1169},[1050,2946,2947],{"class":1052,"line":1512},[1050,2948,2949],{"class":1056},"        # Analyze each migration in rollback plan\n",[1050,2951,2952,2955,2958,2960,2963,2965,2968],{"class":1052,"line":1517},[1050,2953,2954],{"class":1804},"        for",[1050,2956,2957],{"class":1169}," migration",[1050,2959,1201],{"class":1135},[1050,2961,2962],{"class":1169}," backwards ",[1050,2964,1811],{"class":1804},[1050,2966,2967],{"class":1169}," plan",[1050,2969,2415],{"class":1135},[1050,2971,2972,2975,2978,2981],{"class":1052,"line":1523},[1050,2973,2974],{"class":1804},"            if",[1050,2976,2977],{"class":2592}," not",[1050,2979,2980],{"class":1169}," backwards",[1050,2982,2415],{"class":1135},[1050,2984,2985,2988],{"class":1052,"line":1540},[1050,2986,2987],{"class":1804},"                continue",[1050,2989,2990],{"class":1056},"  # Skip forward migrations\n",[1050,2992,2993],{"class":1052,"line":1550},[1050,2994,2995],{"class":1169},"            \n",[1050,2997,2998,3001,3003,3005,3007,3010,3012,3015],{"class":1052,"line":1555},[1050,2999,3000],{"class":1169},"            migration_analysis ",[1050,3002,1179],{"class":1135},[1050,3004,2547],{"class":2478},[1050,3006,1143],{"class":1135},[1050,3008,3009],{"class":1250},"_analyze_migration_rollback",[1050,3011,1136],{"class":1135},[1050,3013,3014],{"class":1250},"migration",[1050,3016,1793],{"class":1135},[1050,3018,3019],{"class":1052,"line":1564},[1050,3020,2995],{"class":1169},[1050,3022,3023,3026,3029,3031,3033,3035,3038,3041],{"class":1052,"line":1586},[1050,3024,3025],{"class":1169},"            safety_analysis",[1050,3027,3028],{"class":1135},"[",[1050,3030,1192],{"class":1191},[1050,3032,2928],{"class":1195},[1050,3034,1192],{"class":1191},[1050,3036,3037],{"class":1135},"].",[1050,3039,3040],{"class":1250},"append",[1050,3042,3043],{"class":1135},"({\n",[1050,3045,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3079,3081,3083],{"class":1052,"line":1591},[1050,3047,2627],{"class":1191},[1050,3049,3014],{"class":1195},[1050,3051,1192],{"class":1191},[1050,3053,2635],{"class":1135},[1050,3055,2654],{"class":1127},[1050,3057,1631],{"class":1195},[1050,3059,2661],{"class":2660},[1050,3061,3014],{"class":1250},[1050,3063,1143],{"class":1135},[1050,3065,2571],{"class":1819},[1050,3067,2666],{"class":2660},[1050,3069,1143],{"class":1195},[1050,3071,2661],{"class":2660},[1050,3073,3014],{"class":1250},[1050,3075,1143],{"class":1135},[1050,3077,3078],{"class":1819},"name",[1050,3080,2666],{"class":2660},[1050,3082,1631],{"class":1195},[1050,3084,1273],{"class":1135},[1050,3086,3087,3089,3092,3094,3096],{"class":1052,"line":1596},[1050,3088,2627],{"class":1191},[1050,3090,3091],{"class":1195},"analysis",[1050,3093,1192],{"class":1191},[1050,3095,2635],{"class":1135},[1050,3097,3098],{"class":1250}," migration_analysis\n",[1050,3100,3101],{"class":1052,"line":1605},[1050,3102,3103],{"class":1135},"            })\n",[1050,3105,3106],{"class":1052,"line":1611},[1050,3107,2995],{"class":1169},[1050,3109,3110],{"class":1052,"line":1623},[1050,3111,3112],{"class":1056},"            # Aggregate risks\n",[1050,3114,3115,3117,3119,3122,3124,3126,3129,3131],{"class":1052,"line":1641},[1050,3116,2974],{"class":1804},[1050,3118,2977],{"class":2592},[1050,3120,3121],{"class":1169}," migration_analysis",[1050,3123,3028],{"class":1135},[1050,3125,1192],{"class":1191},[1050,3127,3128],{"class":1195},"reversible",[1050,3130,1192],{"class":1191},[1050,3132,3133],{"class":1135},"]:\n",[1050,3135,3136,3139,3141,3143,3145,3147,3150,3152],{"class":1052,"line":1658},[1050,3137,3138],{"class":1169},"                safety_analysis",[1050,3140,3028],{"class":1135},[1050,3142,1192],{"class":1191},[1050,3144,2630],{"class":1195},[1050,3146,1192],{"class":1191},[1050,3148,3149],{"class":1135},"]",[1050,3151,1852],{"class":1135},[1050,3153,3154],{"class":1835}," False\n",[1050,3156,3157,3159,3161,3163,3165,3167,3169,3172],{"class":1052,"line":1663},[1050,3158,3138],{"class":1169},[1050,3160,3028],{"class":1135},[1050,3162,1192],{"class":1191},[1050,3164,2898],{"class":1195},[1050,3166,1192],{"class":1191},[1050,3168,3037],{"class":1135},[1050,3170,3171],{"class":1250},"extend",[1050,3173,1254],{"class":1135},[1050,3175,3176,3179,3181,3183,3185,3187],{"class":1052,"line":1668},[1050,3177,3178],{"class":1250},"                    migration_analysis",[1050,3180,3028],{"class":1135},[1050,3182,1192],{"class":1191},[1050,3184,2898],{"class":1195},[1050,3186,1192],{"class":1191},[1050,3188,3189],{"class":1135},"]\n",[1050,3191,3192],{"class":1052,"line":1674},[1050,3193,3194],{"class":1135},"                )\n",[1050,3196,3197],{"class":1052,"line":1686},[1050,3198,2995],{"class":1169},[1050,3200,3201,3203,3205,3207,3209,3211,3213],{"class":1052,"line":1699},[1050,3202,2974],{"class":1804},[1050,3204,3121],{"class":1169},[1050,3206,3028],{"class":1135},[1050,3208,1192],{"class":1191},[1050,3210,2883],{"class":1195},[1050,3212,1192],{"class":1191},[1050,3214,3133],{"class":1135},[1050,3216,3217,3219,3221,3223,3225,3227,3229,3231],{"class":1052,"line":1712},[1050,3218,3138],{"class":1169},[1050,3220,3028],{"class":1135},[1050,3222,1192],{"class":1191},[1050,3224,2883],{"class":1195},[1050,3226,1192],{"class":1191},[1050,3228,3149],{"class":1135},[1050,3230,1852],{"class":1135},[1050,3232,3233],{"class":1835}," True\n",[1050,3235,3236],{"class":1052,"line":1717},[1050,3237,2995],{"class":1169},[1050,3239,3240,3242,3244,3246,3248,3250,3252,3254,3256,3259,3261,3263,3265,3267],{"class":1052,"line":1722},[1050,3241,3025],{"class":1169},[1050,3243,3028],{"class":1135},[1050,3245,1192],{"class":1191},[1050,3247,2869],{"class":1195},[1050,3249,1192],{"class":1191},[1050,3251,3037],{"class":1135},[1050,3253,3171],{"class":1250},[1050,3255,1136],{"class":1135},[1050,3257,3258],{"class":1250},"migration_analysis",[1050,3260,3028],{"class":1135},[1050,3262,1192],{"class":1191},[1050,3264,2869],{"class":1195},[1050,3266,1192],{"class":1191},[1050,3268,2767],{"class":1135},[1050,3270,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297],{"class":1052,"line":1727},[1050,3272,3025],{"class":1169},[1050,3274,3028],{"class":1135},[1050,3276,1192],{"class":1191},[1050,3278,2911],{"class":1195},[1050,3280,1192],{"class":1191},[1050,3282,3037],{"class":1135},[1050,3284,1982],{"class":1250},[1050,3286,1136],{"class":1135},[1050,3288,3258],{"class":1250},[1050,3290,3028],{"class":1135},[1050,3292,1192],{"class":1191},[1050,3294,2911],{"class":1195},[1050,3296,1192],{"class":1191},[1050,3298,2767],{"class":1135},[1050,3300,3301],{"class":1052,"line":1750},[1050,3302,1331],{"class":1169},[1050,3304,3305,3308],{"class":1052,"line":1760},[1050,3306,3307],{"class":1804},"        return",[1050,3309,3310],{"class":1169}," safety_analysis\n",[1050,3312,3313],{"class":1052,"line":1796},[1050,3314,1170],{"class":1169},[1050,3316,3317,3319,3322,3324,3326,3328,3330],{"class":1052,"line":1801},[1050,3318,2433],{"class":1127},[1050,3320,3321],{"class":1733}," _analyze_migration_rollback",[1050,3323,1136],{"class":1135},[1050,3325,2443],{"class":2442},[1050,3327,1201],{"class":1135},[1050,3329,2957],{"class":1739},[1050,3331,1149],{"class":1135},[1050,3333,3334,3336,3339],{"class":1052,"line":1841},[1050,3335,2528],{"class":1155},[1050,3337,3338],{"class":1159},"Analyze rollback safety for a single migration",[1050,3340,1163],{"class":1155},[1050,3342,3343],{"class":1052,"line":1868},[1050,3344,1331],{"class":1169},[1050,3346,3347,3350,3352],{"class":1052,"line":1881},[1050,3348,3349],{"class":1169},"        analysis ",[1050,3351,1179],{"class":1135},[1050,3353,2622],{"class":1135},[1050,3355,3356,3358,3360,3362,3364,3366],{"class":1052,"line":1886},[1050,3357,2851],{"class":1191},[1050,3359,3128],{"class":1195},[1050,3361,1192],{"class":1191},[1050,3363,2635],{"class":1135},[1050,3365,2860],{"class":1835},[1050,3367,1273],{"class":1135},[1050,3369,3370,3372,3374,3376,3378,3380],{"class":1052,"line":1904},[1050,3371,2851],{"class":1191},[1050,3373,2883],{"class":1195},[1050,3375,1192],{"class":1191},[1050,3377,2635],{"class":1135},[1050,3379,2638],{"class":1835},[1050,3381,1273],{"class":1135},[1050,3383,3384,3386,3388,3390,3392],{"class":1052,"line":1914},[1050,3385,2851],{"class":1191},[1050,3387,2869],{"class":1195},[1050,3389,1192],{"class":1191},[1050,3391,2635],{"class":1135},[1050,3393,2876],{"class":1135},[1050,3395,3396,3398,3400,3402,3404],{"class":1052,"line":1945},[1050,3397,2851],{"class":1191},[1050,3399,2898],{"class":1195},[1050,3401,1192],{"class":1191},[1050,3403,2635],{"class":1135},[1050,3405,2876],{"class":1135},[1050,3407,3408,3410,3412,3414,3416,3418],{"class":1052,"line":1950},[1050,3409,2851],{"class":1191},[1050,3411,2911],{"class":1195},[1050,3413,1192],{"class":1191},[1050,3415,2635],{"class":1135},[1050,3417,2918],{"class":2775},[1050,3419,1878],{"class":1135},[1050,3421,3422],{"class":1052,"line":1956},[1050,3423,2940],{"class":1135},[1050,3425,3426],{"class":1052,"line":1996},[1050,3427,1331],{"class":1169},[1050,3429,3430,3432,3435,3437,3439,3441,3444],{"class":1052,"line":2001},[1050,3431,2954],{"class":1804},[1050,3433,3434],{"class":1169}," operation ",[1050,3436,1811],{"class":1804},[1050,3438,2957],{"class":1169},[1050,3440,1143],{"class":1135},[1050,3442,3443],{"class":1819},"operations",[1050,3445,2415],{"class":1135},[1050,3447,3448,3451,3453,3455,3457,3460,3462,3465],{"class":1052,"line":2007},[1050,3449,3450],{"class":1169},"            op_analysis ",[1050,3452,1179],{"class":1135},[1050,3454,2547],{"class":2478},[1050,3456,1143],{"class":1135},[1050,3458,3459],{"class":1250},"_analyze_operation_rollback",[1050,3461,1136],{"class":1135},[1050,3463,3464],{"class":1250},"operation",[1050,3466,1793],{"class":1135},[1050,3468,3469],{"class":1052,"line":2024},[1050,3470,2995],{"class":1169},[1050,3472,3473,3475,3477,3480,3482,3484,3486,3488],{"class":1052,"line":2034},[1050,3474,2974],{"class":1804},[1050,3476,2977],{"class":2592},[1050,3478,3479],{"class":1169}," op_analysis",[1050,3481,3028],{"class":1135},[1050,3483,1192],{"class":1191},[1050,3485,3128],{"class":1195},[1050,3487,1192],{"class":1191},[1050,3489,3133],{"class":1135},[1050,3491,3492,3495,3497,3499,3501,3503,3505,3507],{"class":1052,"line":2039},[1050,3493,3494],{"class":1169},"                analysis",[1050,3496,3028],{"class":1135},[1050,3498,1192],{"class":1191},[1050,3500,3128],{"class":1195},[1050,3502,1192],{"class":1191},[1050,3504,3149],{"class":1135},[1050,3506,1852],{"class":1135},[1050,3508,3154],{"class":1835},[1050,3510,3511,3513,3515,3517,3519,3521,3523,3525,3527,3530],{"class":1052,"line":2048},[1050,3512,3494],{"class":1169},[1050,3514,3028],{"class":1135},[1050,3516,1192],{"class":1191},[1050,3518,2898],{"class":1195},[1050,3520,1192],{"class":1191},[1050,3522,3037],{"class":1135},[1050,3524,3040],{"class":1250},[1050,3526,1136],{"class":1135},[1050,3528,3529],{"class":1250},"op_analysis",[1050,3531,1793],{"class":1135},[1050,3533,3534],{"class":1052,"line":2070},[1050,3535,2995],{"class":1169},[1050,3537,3538,3540,3542,3544,3546,3548,3550],{"class":1052,"line":2075},[1050,3539,2974],{"class":1804},[1050,3541,3479],{"class":1169},[1050,3543,3028],{"class":1135},[1050,3545,1192],{"class":1191},[1050,3547,2883],{"class":1195},[1050,3549,1192],{"class":1191},[1050,3551,3133],{"class":1135},[1050,3553,3554,3556,3558,3560,3562,3564,3566,3568],{"class":1052,"line":2080},[1050,3555,3494],{"class":1169},[1050,3557,3028],{"class":1135},[1050,3559,1192],{"class":1191},[1050,3561,2883],{"class":1195},[1050,3563,1192],{"class":1191},[1050,3565,3149],{"class":1135},[1050,3567,1852],{"class":1135},[1050,3569,3233],{"class":1835},[1050,3571,3572],{"class":1052,"line":2089},[1050,3573,2995],{"class":1169},[1050,3575,3576,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597,3599,3601,3603],{"class":1052,"line":2095},[1050,3577,3578],{"class":1169},"            analysis",[1050,3580,3028],{"class":1135},[1050,3582,1192],{"class":1191},[1050,3584,2869],{"class":1195},[1050,3586,1192],{"class":1191},[1050,3588,3037],{"class":1135},[1050,3590,3171],{"class":1250},[1050,3592,1136],{"class":1135},[1050,3594,3529],{"class":1250},[1050,3596,3028],{"class":1135},[1050,3598,1192],{"class":1191},[1050,3600,2869],{"class":1195},[1050,3602,1192],{"class":1191},[1050,3604,2767],{"class":1135},[1050,3606,3607,3609,3611,3613,3615,3617,3619,3621,3623,3625,3627,3629,3631,3633],{"class":1052,"line":2107},[1050,3608,3578],{"class":1169},[1050,3610,3028],{"class":1135},[1050,3612,1192],{"class":1191},[1050,3614,2911],{"class":1195},[1050,3616,1192],{"class":1191},[1050,3618,3037],{"class":1135},[1050,3620,1982],{"class":1250},[1050,3622,1136],{"class":1135},[1050,3624,3529],{"class":1250},[1050,3626,3028],{"class":1135},[1050,3628,1192],{"class":1191},[1050,3630,2911],{"class":1195},[1050,3632,1192],{"class":1191},[1050,3634,2767],{"class":1135},[1050,3636,3637],{"class":1052,"line":2122},[1050,3638,1331],{"class":1169},[1050,3640,3641,3643],{"class":1052,"line":2138},[1050,3642,3307],{"class":1804},[1050,3644,3645],{"class":1169}," analysis\n",[1050,3647,3648],{"class":1052,"line":2143},[1050,3649,1170],{"class":1169},[1050,3651,3652,3654,3657,3659,3661,3663,3666],{"class":1052,"line":2148},[1050,3653,2433],{"class":1127},[1050,3655,3656],{"class":1733}," _analyze_operation_rollback",[1050,3658,1136],{"class":1135},[1050,3660,2443],{"class":2442},[1050,3662,1201],{"class":1135},[1050,3664,3665],{"class":1739}," operation",[1050,3667,1149],{"class":1135},[1050,3669,3670,3672,3675],{"class":1052,"line":2154},[1050,3671,2528],{"class":1155},[1050,3673,3674],{"class":1159},"Analyze rollback safety for a single operation",[1050,3676,1163],{"class":1155},[1050,3678,3679],{"class":1052,"line":2165},[1050,3680,1331],{"class":1169},[1050,3682,3683,3686,3688,3690,3692,3696,3698],{"class":1052,"line":2177},[1050,3684,3685],{"class":1169},"        op_name ",[1050,3687,1179],{"class":1135},[1050,3689,3665],{"class":1169},[1050,3691,1143],{"class":1135},[1050,3693,3695],{"class":3694},"s131V","__class__",[1050,3697,1143],{"class":1135},[1050,3699,3700],{"class":3694},"__name__\n",[1050,3702,3703],{"class":1052,"line":2200},[1050,3704,1331],{"class":1169},[1050,3706,3707,3709,3711],{"class":1052,"line":2205},[1050,3708,3349],{"class":1169},[1050,3710,1179],{"class":1135},[1050,3712,2622],{"class":1135},[1050,3714,3715,3717,3719,3721,3723,3726],{"class":1052,"line":2210},[1050,3716,2851],{"class":1191},[1050,3718,3464],{"class":1195},[1050,3720,1192],{"class":1191},[1050,3722,2635],{"class":1135},[1050,3724,3725],{"class":1169}," op_name",[1050,3727,1273],{"class":1135},[1050,3729,3730,3732,3734,3736,3738,3740],{"class":1052,"line":2216},[1050,3731,2851],{"class":1191},[1050,3733,3128],{"class":1195},[1050,3735,1192],{"class":1191},[1050,3737,2635],{"class":1135},[1050,3739,2860],{"class":1835},[1050,3741,1273],{"class":1135},[1050,3743,3744,3746,3748,3750,3752,3754],{"class":1052,"line":2227},[1050,3745,2851],{"class":1191},[1050,3747,2883],{"class":1195},[1050,3749,1192],{"class":1191},[1050,3751,2635],{"class":1135},[1050,3753,2638],{"class":1835},[1050,3755,1273],{"class":1135},[1050,3757,3758,3760,3762,3764,3766],{"class":1052,"line":2243},[1050,3759,2851],{"class":1191},[1050,3761,2869],{"class":1195},[1050,3763,1192],{"class":1191},[1050,3765,2635],{"class":1135},[1050,3767,2876],{"class":1135},[1050,3769,3770,3772,3774,3776,3778,3780],{"class":1052,"line":2249},[1050,3771,2851],{"class":1191},[1050,3773,2911],{"class":1195},[1050,3775,1192],{"class":1191},[1050,3777,2635],{"class":1135},[1050,3779,2918],{"class":2775},[1050,3781,1878],{"class":1135},[1050,3783,3784],{"class":1052,"line":2254},[1050,3785,2940],{"class":1135},[1050,3787,3788],{"class":1052,"line":2259},[1050,3789,1331],{"class":1169},[1050,3791,3792],{"class":1052,"line":2264},[1050,3793,3794],{"class":1056},"        # Analyze specific operation types\n",[1050,3796,3797,3799,3802,3805,3807,3810,3812],{"class":1052,"line":2282},[1050,3798,2586],{"class":1804},[1050,3800,3801],{"class":1169}," op_name ",[1050,3803,3804],{"class":2592},"==",[1050,3806,1204],{"class":1191},[1050,3808,3809],{"class":1195},"CreateModel",[1050,3811,1192],{"class":1191},[1050,3813,2415],{"class":1135},[1050,3815,3816,3818,3820,3822,3824,3826,3828,3830],{"class":1052,"line":2292},[1050,3817,3578],{"class":1169},[1050,3819,3028],{"class":1135},[1050,3821,1192],{"class":1191},[1050,3823,2883],{"class":1195},[1050,3825,1192],{"class":1191},[1050,3827,3149],{"class":1135},[1050,3829,1852],{"class":1135},[1050,3831,3233],{"class":1835},[1050,3833,3834,3836,3838,3840,3842,3844,3846,3848],{"class":1052,"line":2323},[1050,3835,3578],{"class":1169},[1050,3837,3028],{"class":1135},[1050,3839,1192],{"class":1191},[1050,3841,2869],{"class":1195},[1050,3843,1192],{"class":1191},[1050,3845,3037],{"class":1135},[1050,3847,3040],{"class":1250},[1050,3849,1254],{"class":1135},[1050,3851,3852,3855,3858,3860,3862,3864,3866,3868],{"class":1052,"line":2328},[1050,3853,3854],{"class":1127},"                f",[1050,3856,3857],{"class":1195},"\"Rolling back CreateModel will delete all data in ",[1050,3859,2661],{"class":2660},[1050,3861,3464],{"class":1250},[1050,3863,1143],{"class":1135},[1050,3865,3078],{"class":1819},[1050,3867,2666],{"class":2660},[1050,3869,3870],{"class":1195}," table\"\n",[1050,3872,3873],{"class":1052,"line":2334},[1050,3874,3875],{"class":1135},"            )\n",[1050,3877,3878,3880,3882,3884,3886,3888,3890,3893,3895,3897,3899,3901,3903,3906],{"class":1052,"line":2357},[1050,3879,3578],{"class":1169},[1050,3881,3028],{"class":1135},[1050,3883,1192],{"class":1191},[1050,3885,2911],{"class":1195},[1050,3887,1192],{"class":1191},[1050,3889,3037],{"class":1135},[1050,3891,3892],{"class":1250},"add",[1050,3894,1136],{"class":1135},[1050,3896,3464],{"class":1250},[1050,3898,1143],{"class":1135},[1050,3900,3078],{"class":1819},[1050,3902,1143],{"class":1135},[1050,3904,3905],{"class":1250},"lower",[1050,3907,3908],{"class":1135},"())\n",[1050,3910,3911],{"class":1052,"line":2363},[1050,3912,1331],{"class":1169},[1050,3914,3915,3918,3920,3922,3924,3927,3929],{"class":1052,"line":2388},[1050,3916,3917],{"class":1804},"        elif",[1050,3919,3801],{"class":1169},[1050,3921,3804],{"class":2592},[1050,3923,1204],{"class":1191},[1050,3925,3926],{"class":1195},"DeleteModel",[1050,3928,1192],{"class":1191},[1050,3930,2415],{"class":1135},[1050,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950],{"class":1052,"line":3933},116,[1050,3935,3578],{"class":1169},[1050,3937,3028],{"class":1135},[1050,3939,1192],{"class":1191},[1050,3941,3128],{"class":1195},[1050,3943,1192],{"class":1191},[1050,3945,3149],{"class":1135},[1050,3947,1852],{"class":1135},[1050,3949,2860],{"class":1835},[1050,3951,3952],{"class":1056},"  # DeleteModel rollback recreates table\n",[1050,3954,3956,3958,3960,3962,3964,3966,3968,3970],{"class":1052,"line":3955},117,[1050,3957,3578],{"class":1169},[1050,3959,3028],{"class":1135},[1050,3961,1192],{"class":1191},[1050,3963,2869],{"class":1195},[1050,3965,1192],{"class":1191},[1050,3967,3037],{"class":1135},[1050,3969,3040],{"class":1250},[1050,3971,1254],{"class":1135},[1050,3973,3975,3977,3980,3982,3984,3986,3988,3990],{"class":1052,"line":3974},118,[1050,3976,3854],{"class":1127},[1050,3978,3979],{"class":1195},"\"Rolling back DeleteModel will recreate ",[1050,3981,2661],{"class":2660},[1050,3983,3464],{"class":1250},[1050,3985,1143],{"class":1135},[1050,3987,3078],{"class":1819},[1050,3989,2666],{"class":2660},[1050,3991,3992],{"class":1195}," table (data already lost)\"\n",[1050,3994,3996],{"class":1052,"line":3995},119,[1050,3997,3875],{"class":1135},[1050,3999,4001],{"class":1052,"line":4000},120,[1050,4002,1331],{"class":1169},[1050,4004,4006,4008,4010,4012,4014,4016,4018],{"class":1052,"line":4005},121,[1050,4007,3917],{"class":1804},[1050,4009,3801],{"class":1169},[1050,4011,3804],{"class":2592},[1050,4013,1204],{"class":1191},[1050,4015,1251],{"class":1195},[1050,4017,1192],{"class":1191},[1050,4019,2415],{"class":1135},[1050,4021,4023,4025,4027,4029,4031,4033,4035,4037],{"class":1052,"line":4022},122,[1050,4024,3578],{"class":1169},[1050,4026,3028],{"class":1135},[1050,4028,1192],{"class":1191},[1050,4030,2883],{"class":1195},[1050,4032,1192],{"class":1191},[1050,4034,3149],{"class":1135},[1050,4036,1852],{"class":1135},[1050,4038,3233],{"class":1835},[1050,4040,4042,4044,4046,4048,4050,4052,4054,4056],{"class":1052,"line":4041},123,[1050,4043,3578],{"class":1169},[1050,4045,3028],{"class":1135},[1050,4047,1192],{"class":1191},[1050,4049,2869],{"class":1195},[1050,4051,1192],{"class":1191},[1050,4053,3037],{"class":1135},[1050,4055,3040],{"class":1250},[1050,4057,1254],{"class":1135},[1050,4059,4061,4063,4066,4068,4070,4072,4074,4076],{"class":1052,"line":4060},124,[1050,4062,3854],{"class":1127},[1050,4064,4065],{"class":1195},"\"Rolling back AddField will delete data in ",[1050,4067,2661],{"class":2660},[1050,4069,3464],{"class":1250},[1050,4071,1143],{"class":1135},[1050,4073,3078],{"class":1819},[1050,4075,2666],{"class":2660},[1050,4077,4078],{"class":1195}," field\"\n",[1050,4080,4082],{"class":1052,"line":4081},125,[1050,4083,3875],{"class":1135},[1050,4085,4087,4089,4092,4094,4096,4098,4100,4103,4105],{"class":1052,"line":4086},126,[1050,4088,2974],{"class":1804},[1050,4090,4091],{"class":2436}," hasattr",[1050,4093,1136],{"class":1135},[1050,4095,3464],{"class":1250},[1050,4097,1201],{"class":1135},[1050,4099,1204],{"class":1191},[1050,4101,4102],{"class":1195},"model_name",[1050,4104,1192],{"class":1191},[1050,4106,1149],{"class":1135},[1050,4108,4110,4112,4114,4116,4118,4120,4122,4124,4126,4128,4130,4132,4134,4136],{"class":1052,"line":4109},127,[1050,4111,3494],{"class":1169},[1050,4113,3028],{"class":1135},[1050,4115,1192],{"class":1191},[1050,4117,2911],{"class":1195},[1050,4119,1192],{"class":1191},[1050,4121,3037],{"class":1135},[1050,4123,3892],{"class":1250},[1050,4125,1136],{"class":1135},[1050,4127,3464],{"class":1250},[1050,4129,1143],{"class":1135},[1050,4131,4102],{"class":1819},[1050,4133,1143],{"class":1135},[1050,4135,3905],{"class":1250},[1050,4137,3908],{"class":1135},[1050,4139,4141],{"class":1052,"line":4140},128,[1050,4142,1331],{"class":1169},[1050,4144,4146,4148,4150,4152,4154,4156,4158],{"class":1052,"line":4145},129,[1050,4147,3917],{"class":1804},[1050,4149,3801],{"class":1169},[1050,4151,3804],{"class":2592},[1050,4153,1204],{"class":1191},[1050,4155,2102],{"class":1195},[1050,4157,1192],{"class":1191},[1050,4159,2415],{"class":1135},[1050,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179],{"class":1052,"line":4162},130,[1050,4164,3578],{"class":1169},[1050,4166,3028],{"class":1135},[1050,4168,1192],{"class":1191},[1050,4170,3128],{"class":1195},[1050,4172,1192],{"class":1191},[1050,4174,3149],{"class":1135},[1050,4176,1852],{"class":1135},[1050,4178,2860],{"class":1835},[1050,4180,4181],{"class":1056},"  # RemoveField rollback recreates field\n",[1050,4183,4185,4187,4189,4191,4193,4195,4197,4199],{"class":1052,"line":4184},131,[1050,4186,3578],{"class":1169},[1050,4188,3028],{"class":1135},[1050,4190,1192],{"class":1191},[1050,4192,2869],{"class":1195},[1050,4194,1192],{"class":1191},[1050,4196,3037],{"class":1135},[1050,4198,3040],{"class":1250},[1050,4200,1254],{"class":1135},[1050,4202,4204,4206,4209,4211,4213,4215,4217,4219],{"class":1052,"line":4203},132,[1050,4205,3854],{"class":1127},[1050,4207,4208],{"class":1195},"\"Rolling back RemoveField will recreate ",[1050,4210,2661],{"class":2660},[1050,4212,3464],{"class":1250},[1050,4214,1143],{"class":1135},[1050,4216,3078],{"class":1819},[1050,4218,2666],{"class":2660},[1050,4220,4221],{"class":1195}," field (data already lost)\"\n",[1050,4223,4225],{"class":1052,"line":4224},133,[1050,4226,3875],{"class":1135},[1050,4228,4230],{"class":1052,"line":4229},134,[1050,4231,1331],{"class":1169},[1050,4233,4235,4237,4239,4241,4243,4245,4247],{"class":1052,"line":4234},135,[1050,4236,3917],{"class":1804},[1050,4238,3801],{"class":1169},[1050,4240,3804],{"class":2592},[1050,4242,1204],{"class":1191},[1050,4244,1347],{"class":1195},[1050,4246,1192],{"class":1191},[1050,4248,2415],{"class":1135},[1050,4250,4252,4254,4256,4258,4260,4262,4264,4266],{"class":1052,"line":4251},136,[1050,4253,3578],{"class":1169},[1050,4255,3028],{"class":1135},[1050,4257,1192],{"class":1191},[1050,4259,2869],{"class":1195},[1050,4261,1192],{"class":1191},[1050,4263,3037],{"class":1135},[1050,4265,3040],{"class":1250},[1050,4267,1254],{"class":1135},[1050,4269,4271,4273,4276,4278,4280,4282,4284,4286],{"class":1052,"line":4270},137,[1050,4272,3854],{"class":1127},[1050,4274,4275],{"class":1195},"\"Rolling back AlterField may cause data compatibility issues for ",[1050,4277,2661],{"class":2660},[1050,4279,3464],{"class":1250},[1050,4281,1143],{"class":1135},[1050,4283,3078],{"class":1819},[1050,4285,2666],{"class":2660},[1050,4287,2829],{"class":1195},[1050,4289,4291],{"class":1052,"line":4290},138,[1050,4292,3875],{"class":1135},[1050,4294,4296,4298,4300,4302,4304,4306,4308,4310,4312],{"class":1052,"line":4295},139,[1050,4297,2974],{"class":1804},[1050,4299,4091],{"class":2436},[1050,4301,1136],{"class":1135},[1050,4303,3464],{"class":1250},[1050,4305,1201],{"class":1135},[1050,4307,1204],{"class":1191},[1050,4309,4102],{"class":1195},[1050,4311,1192],{"class":1191},[1050,4313,1149],{"class":1135},[1050,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343],{"class":1052,"line":4316},140,[1050,4318,3494],{"class":1169},[1050,4320,3028],{"class":1135},[1050,4322,1192],{"class":1191},[1050,4324,2911],{"class":1195},[1050,4326,1192],{"class":1191},[1050,4328,3037],{"class":1135},[1050,4330,3892],{"class":1250},[1050,4332,1136],{"class":1135},[1050,4334,3464],{"class":1250},[1050,4336,1143],{"class":1135},[1050,4338,4102],{"class":1819},[1050,4340,1143],{"class":1135},[1050,4342,3905],{"class":1250},[1050,4344,3908],{"class":1135},[1050,4346,4348],{"class":1052,"line":4347},141,[1050,4349,1331],{"class":1169},[1050,4351,4353,4355,4357,4359,4361,4363,4365],{"class":1052,"line":4352},142,[1050,4354,3917],{"class":1804},[1050,4356,3801],{"class":1169},[1050,4358,3804],{"class":2592},[1050,4360,1204],{"class":1191},[1050,4362,1618],{"class":1195},[1050,4364,1192],{"class":1191},[1050,4366,2415],{"class":1135},[1050,4368,4370,4372,4374,4376,4378,4380,4382,4384,4387,4389,4392,4395,4397,4399,4401,4403],{"class":1052,"line":4369},143,[1050,4371,2974],{"class":1804},[1050,4373,2977],{"class":2592},[1050,4375,4091],{"class":2436},[1050,4377,1136],{"class":1135},[1050,4379,3464],{"class":1250},[1050,4381,1201],{"class":1135},[1050,4383,1204],{"class":1191},[1050,4385,4386],{"class":1195},"reverse_sql",[1050,4388,1192],{"class":1191},[1050,4390,4391],{"class":1135},")",[1050,4393,4394],{"class":2592}," or",[1050,4396,2977],{"class":2592},[1050,4398,3665],{"class":1169},[1050,4400,1143],{"class":1135},[1050,4402,4386],{"class":1819},[1050,4404,2415],{"class":1135},[1050,4406,4408,4410,4412,4414,4416,4418,4420,4422],{"class":1052,"line":4407},144,[1050,4409,3494],{"class":1169},[1050,4411,3028],{"class":1135},[1050,4413,1192],{"class":1191},[1050,4415,3128],{"class":1195},[1050,4417,1192],{"class":1191},[1050,4419,3149],{"class":1135},[1050,4421,1852],{"class":1135},[1050,4423,3154],{"class":1835},[1050,4425,4427,4429,4431,4433,4435,4437,4439,4441],{"class":1052,"line":4426},145,[1050,4428,3494],{"class":1169},[1050,4430,3028],{"class":1135},[1050,4432,1192],{"class":1191},[1050,4434,2898],{"class":1195},[1050,4436,1192],{"class":1191},[1050,4438,3037],{"class":1135},[1050,4440,3040],{"class":1250},[1050,4442,1254],{"class":1135},[1050,4444,4446,4449],{"class":1052,"line":4445},146,[1050,4447,4448],{"class":1127},"                    f",[1050,4450,4451],{"class":1195},"\"RunSQL operation without reverse_sql\"\n",[1050,4453,4455],{"class":1052,"line":4454},147,[1050,4456,3194],{"class":1135},[1050,4458,4460,4463],{"class":1052,"line":4459},148,[1050,4461,4462],{"class":1804},"            else",[1050,4464,2415],{"class":1135},[1050,4466,4468,4470,4472,4474,4476,4478,4480,4482],{"class":1052,"line":4467},149,[1050,4469,3494],{"class":1169},[1050,4471,3028],{"class":1135},[1050,4473,1192],{"class":1191},[1050,4475,2869],{"class":1195},[1050,4477,1192],{"class":1191},[1050,4479,3037],{"class":1135},[1050,4481,3040],{"class":1250},[1050,4483,1254],{"class":1135},[1050,4485,4487,4490,4493],{"class":1052,"line":4486},150,[1050,4488,4489],{"class":1191},"                    \"",[1050,4491,4492],{"class":1195},"Custom SQL rollback - verify reverse_sql is correct",[1050,4494,2829],{"class":1191},[1050,4496,4498],{"class":1052,"line":4497},151,[1050,4499,3194],{"class":1135},[1050,4501,4503],{"class":1052,"line":4502},152,[1050,4504,1331],{"class":1169},[1050,4506,4508,4510,4512,4514,4516,4518,4520],{"class":1052,"line":4507},153,[1050,4509,3917],{"class":1804},[1050,4511,3801],{"class":1169},[1050,4513,3804],{"class":2592},[1050,4515,1204],{"class":1191},[1050,4517,1681],{"class":1195},[1050,4519,1192],{"class":1191},[1050,4521,2415],{"class":1135},[1050,4523,4525,4527,4529,4531,4533,4535,4537,4539,4541,4544,4546,4548,4550],{"class":1052,"line":4524},154,[1050,4526,2974],{"class":1804},[1050,4528,2568],{"class":1135},[1050,4530,2593],{"class":2592},[1050,4532,4091],{"class":2436},[1050,4534,1136],{"class":1135},[1050,4536,3464],{"class":1250},[1050,4538,1201],{"class":1135},[1050,4540,1204],{"class":1191},[1050,4542,4543],{"class":1195},"reverse_code",[1050,4545,1192],{"class":1191},[1050,4547,4391],{"class":1135},[1050,4549,4394],{"class":2592},[1050,4551,4552],{"class":1169}," \n",[1050,4554,4556,4559,4561,4563,4566,4569,4571,4573,4575,4577],{"class":1052,"line":4555},155,[1050,4557,4558],{"class":1169},"                operation",[1050,4560,1143],{"class":1135},[1050,4562,4543],{"class":1819},[1050,4564,4565],{"class":2592}," ==",[1050,4567,4568],{"class":1169}," migrations",[1050,4570,1143],{"class":1135},[1050,4572,1681],{"class":1819},[1050,4574,1143],{"class":1135},[1050,4576,2192],{"class":1819},[1050,4578,1149],{"class":1135},[1050,4580,4582,4584,4586,4588,4590,4592,4594,4596],{"class":1052,"line":4581},156,[1050,4583,3494],{"class":1169},[1050,4585,3028],{"class":1135},[1050,4587,1192],{"class":1191},[1050,4589,3128],{"class":1195},[1050,4591,1192],{"class":1191},[1050,4593,3149],{"class":1135},[1050,4595,1852],{"class":1135},[1050,4597,3154],{"class":1835},[1050,4599,4601,4603,4605,4607,4609,4611,4613,4615],{"class":1052,"line":4600},157,[1050,4602,3494],{"class":1169},[1050,4604,3028],{"class":1135},[1050,4606,1192],{"class":1191},[1050,4608,2898],{"class":1195},[1050,4610,1192],{"class":1191},[1050,4612,3037],{"class":1135},[1050,4614,3040],{"class":1250},[1050,4616,1254],{"class":1135},[1050,4618,4620,4622],{"class":1052,"line":4619},158,[1050,4621,4448],{"class":1127},[1050,4623,4624],{"class":1195},"\"RunPython operation without reverse_code\"\n",[1050,4626,4628],{"class":1052,"line":4627},159,[1050,4629,3194],{"class":1135},[1050,4631,4633,4635],{"class":1052,"line":4632},160,[1050,4634,4462],{"class":1804},[1050,4636,2415],{"class":1135},[1050,4638,4640,4642,4644,4646,4648,4650,4652,4654],{"class":1052,"line":4639},161,[1050,4641,3494],{"class":1169},[1050,4643,3028],{"class":1135},[1050,4645,1192],{"class":1191},[1050,4647,2869],{"class":1195},[1050,4649,1192],{"class":1191},[1050,4651,3037],{"class":1135},[1050,4653,3040],{"class":1250},[1050,4655,1254],{"class":1135},[1050,4657,4659,4661,4664],{"class":1052,"line":4658},162,[1050,4660,4489],{"class":1191},[1050,4662,4663],{"class":1195},"Custom Python rollback - verify reverse_code is correct",[1050,4665,2829],{"class":1191},[1050,4667,4669],{"class":1052,"line":4668},163,[1050,4670,3194],{"class":1135},[1050,4672,4674],{"class":1052,"line":4673},164,[1050,4675,1331],{"class":1169},[1050,4677,4679,4681],{"class":1052,"line":4678},165,[1050,4680,3307],{"class":1804},[1050,4682,3645],{"class":1169},[1050,4684,4686],{"class":1052,"line":4685},166,[1050,4687,1170],{"class":1169},[1050,4689,4691,4693,4696,4698,4700,4702,4704,4706,4708],{"class":1052,"line":4690},167,[1050,4692,2433],{"class":1127},[1050,4694,4695],{"class":1733}," suggest_rollback_strategy",[1050,4697,1136],{"class":1135},[1050,4699,2443],{"class":2442},[1050,4701,1201],{"class":1135},[1050,4703,2516],{"class":1739},[1050,4705,1201],{"class":1135},[1050,4707,2521],{"class":1739},[1050,4709,1149],{"class":1135},[1050,4711,4713,4715,4718],{"class":1052,"line":4712},168,[1050,4714,2528],{"class":1155},[1050,4716,4717],{"class":1159},"Suggest strategy for safe rollback",[1050,4719,1163],{"class":1155},[1050,4721,4723],{"class":1052,"line":4722},169,[1050,4724,1331],{"class":1169},[1050,4726,4728,4730,4732,4734,4736,4739,4741,4743,4745,4747],{"class":1052,"line":4727},170,[1050,4729,2842],{"class":1169},[1050,4731,1179],{"class":1135},[1050,4733,2547],{"class":2478},[1050,4735,1143],{"class":1135},[1050,4737,4738],{"class":1250},"analyze_rollback_safety",[1050,4740,1136],{"class":1135},[1050,4742,2571],{"class":1250},[1050,4744,1201],{"class":1135},[1050,4746,2521],{"class":1250},[1050,4748,1793],{"class":1135},[1050,4750,4752],{"class":1052,"line":4751},171,[1050,4753,1331],{"class":1169},[1050,4755,4757,4760,4762],{"class":1052,"line":4756},172,[1050,4758,4759],{"class":1169},"        strategy ",[1050,4761,1179],{"class":1135},[1050,4763,2622],{"class":1135},[1050,4765,4767,4769,4772,4774,4776,4778,4781,4783],{"class":1052,"line":4766},173,[1050,4768,2851],{"class":1191},[1050,4770,4771],{"class":1195},"recommended_approach",[1050,4773,1192],{"class":1191},[1050,4775,2635],{"class":1135},[1050,4777,1204],{"class":1191},[1050,4779,4780],{"class":1195},"direct_rollback",[1050,4782,1192],{"class":1191},[1050,4784,1273],{"class":1135},[1050,4786,4788,4790,4793,4795,4797],{"class":1052,"line":4787},174,[1050,4789,2851],{"class":1191},[1050,4791,4792],{"class":1195},"steps",[1050,4794,1192],{"class":1191},[1050,4796,2635],{"class":1135},[1050,4798,2876],{"class":1135},[1050,4800,4802,4804,4807,4809,4811],{"class":1052,"line":4801},175,[1050,4803,2851],{"class":1191},[1050,4805,4806],{"class":1195},"prerequisites",[1050,4808,1192],{"class":1191},[1050,4810,2635],{"class":1135},[1050,4812,2876],{"class":1135},[1050,4814,4816,4818,4821,4823,4825],{"class":1052,"line":4815},176,[1050,4817,2851],{"class":1191},[1050,4819,4820],{"class":1195},"risks",[1050,4822,1192],{"class":1191},[1050,4824,2635],{"class":1135},[1050,4826,2876],{"class":1135},[1050,4828,4830,4832,4835,4837,4839],{"class":1052,"line":4829},177,[1050,4831,2851],{"class":1191},[1050,4833,4834],{"class":1195},"alternatives",[1050,4836,1192],{"class":1191},[1050,4838,2635],{"class":1135},[1050,4840,2935],{"class":1135},[1050,4842,4844],{"class":1052,"line":4843},178,[1050,4845,2940],{"class":1135},[1050,4847,4849],{"class":1052,"line":4848},179,[1050,4850,1331],{"class":1169},[1050,4852,4854,4856,4858,4861,4863,4865,4867,4869],{"class":1052,"line":4853},180,[1050,4855,2586],{"class":1804},[1050,4857,2977],{"class":2592},[1050,4859,4860],{"class":1169}," safety_analysis",[1050,4862,3028],{"class":1135},[1050,4864,1192],{"class":1191},[1050,4866,2630],{"class":1195},[1050,4868,1192],{"class":1191},[1050,4870,3133],{"class":1135},[1050,4872,4874,4877,4879,4881,4883,4885,4887,4889,4891,4894],{"class":1052,"line":4873},181,[1050,4875,4876],{"class":1169},"            strategy",[1050,4878,3028],{"class":1135},[1050,4880,1192],{"class":1191},[1050,4882,4771],{"class":1195},[1050,4884,1192],{"class":1191},[1050,4886,3149],{"class":1135},[1050,4888,1852],{"class":1135},[1050,4890,1204],{"class":1191},[1050,4892,4893],{"class":1195},"manual_rollback",[1050,4895,4896],{"class":1191},"'\n",[1050,4898,4900,4902,4904,4906,4908,4910,4912,4914],{"class":1052,"line":4899},182,[1050,4901,4876],{"class":1169},[1050,4903,3028],{"class":1135},[1050,4905,1192],{"class":1191},[1050,4907,4792],{"class":1195},[1050,4909,1192],{"class":1191},[1050,4911,3037],{"class":1135},[1050,4913,3171],{"class":1250},[1050,4915,4916],{"class":1135},"([\n",[1050,4918,4920,4923,4926,4928],{"class":1052,"line":4919},183,[1050,4921,4922],{"class":1191},"                \"",[1050,4924,4925],{"class":1195},"1. Create database backup",[1050,4927,1631],{"class":1191},[1050,4929,1273],{"class":1135},[1050,4931,4933,4935,4938,4940],{"class":1052,"line":4932},184,[1050,4934,4922],{"class":1191},[1050,4936,4937],{"class":1195},"2. Review irreversible operations manually",[1050,4939,1631],{"class":1191},[1050,4941,1273],{"class":1135},[1050,4943,4945,4947,4950,4952],{"class":1052,"line":4944},185,[1050,4946,4922],{"class":1191},[1050,4948,4949],{"class":1195},"3. Create custom rollback migration if needed",[1050,4951,1631],{"class":1191},[1050,4953,1273],{"class":1135},[1050,4955,4957,4959,4962],{"class":1052,"line":4956},186,[1050,4958,4922],{"class":1191},[1050,4960,4961],{"class":1195},"4. Test rollback on copy of production data",[1050,4963,2829],{"class":1191},[1050,4965,4967],{"class":1052,"line":4966},187,[1050,4968,4969],{"class":1135},"            ])\n",[1050,4971,4973],{"class":1052,"line":4972},188,[1050,4974,1331],{"class":1169},[1050,4976,4978,4980,4982,4984,4986,4988,4990],{"class":1052,"line":4977},189,[1050,4979,3917],{"class":1804},[1050,4981,4860],{"class":1169},[1050,4983,3028],{"class":1135},[1050,4985,1192],{"class":1191},[1050,4987,2883],{"class":1195},[1050,4989,1192],{"class":1191},[1050,4991,3133],{"class":1135},[1050,4993,4995,4997,4999,5001,5003,5005,5007,5009,5011,5014],{"class":1052,"line":4994},190,[1050,4996,4876],{"class":1169},[1050,4998,3028],{"class":1135},[1050,5000,1192],{"class":1191},[1050,5002,4771],{"class":1195},[1050,5004,1192],{"class":1191},[1050,5006,3149],{"class":1135},[1050,5008,1852],{"class":1135},[1050,5010,1204],{"class":1191},[1050,5012,5013],{"class":1195},"backup_and_rollback",[1050,5015,4896],{"class":1191},[1050,5017,5019,5021,5023,5025,5027,5029,5031,5033,5035,5037,5040,5042],{"class":1052,"line":5018},191,[1050,5020,4876],{"class":1169},[1050,5022,3028],{"class":1135},[1050,5024,1192],{"class":1191},[1050,5026,4806],{"class":1195},[1050,5028,1192],{"class":1191},[1050,5030,3037],{"class":1135},[1050,5032,3040],{"class":1250},[1050,5034,1136],{"class":1135},[1050,5036,1631],{"class":1191},[1050,5038,5039],{"class":1195},"Create database backup",[1050,5041,1631],{"class":1191},[1050,5043,1793],{"class":1135},[1050,5045,5047,5049,5051,5053,5055,5057,5059,5061],{"class":1052,"line":5046},192,[1050,5048,4876],{"class":1169},[1050,5050,3028],{"class":1135},[1050,5052,1192],{"class":1191},[1050,5054,4792],{"class":1195},[1050,5056,1192],{"class":1191},[1050,5058,3037],{"class":1135},[1050,5060,3171],{"class":1250},[1050,5062,4916],{"class":1135},[1050,5064,5066,5068,5071,5073],{"class":1052,"line":5065},193,[1050,5067,4922],{"class":1191},[1050,5069,5070],{"class":1195},"1. Backup database",[1050,5072,1631],{"class":1191},[1050,5074,1273],{"class":1135},[1050,5076,5078,5080,5083,5085],{"class":1052,"line":5077},194,[1050,5079,4922],{"class":1191},[1050,5081,5082],{"class":1195},"2. Export affected data if needed",[1050,5084,1631],{"class":1191},[1050,5086,1273],{"class":1135},[1050,5088,5090,5092,5095,5097],{"class":1052,"line":5089},195,[1050,5091,4922],{"class":1191},[1050,5093,5094],{"class":1195},"3. Perform rollback",[1050,5096,1631],{"class":1191},[1050,5098,1273],{"class":1135},[1050,5100,5102,5104,5107],{"class":1052,"line":5101},196,[1050,5103,4922],{"class":1191},[1050,5105,5106],{"class":1195},"4. Verify data integrity",[1050,5108,2829],{"class":1191},[1050,5110,5112],{"class":1052,"line":5111},197,[1050,5113,4969],{"class":1135},[1050,5115,5117],{"class":1052,"line":5116},198,[1050,5118,1331],{"class":1169},[1050,5120,5122,5125],{"class":1052,"line":5121},199,[1050,5123,5124],{"class":1804},"        else",[1050,5126,2415],{"class":1135},[1050,5128,5130,5132,5134,5136,5138,5140,5142,5144],{"class":1052,"line":5129},200,[1050,5131,4876],{"class":1169},[1050,5133,3028],{"class":1135},[1050,5135,1192],{"class":1191},[1050,5137,4792],{"class":1195},[1050,5139,1192],{"class":1191},[1050,5141,3037],{"class":1135},[1050,5143,3171],{"class":1250},[1050,5145,4916],{"class":1135},[1050,5147,5149,5151,5154,5156,5158,5160,5163,5165,5167,5169],{"class":1052,"line":5148},201,[1050,5150,3854],{"class":1127},[1050,5152,5153],{"class":1195},"\"1. Run: python manage.py migrate ",[1050,5155,2661],{"class":2660},[1050,5157,2571],{"class":1250},[1050,5159,2666],{"class":2660},[1050,5161,5162],{"class":2660}," {",[1050,5164,2673],{"class":1250},[1050,5166,2666],{"class":2660},[1050,5168,1631],{"class":1195},[1050,5170,1273],{"class":1135},[1050,5172,5174,5176,5179,5181],{"class":1052,"line":5173},202,[1050,5175,4922],{"class":1191},[1050,5177,5178],{"class":1195},"2. Verify application functionality",[1050,5180,1631],{"class":1191},[1050,5182,1273],{"class":1135},[1050,5184,5186,5188,5191],{"class":1052,"line":5185},203,[1050,5187,4922],{"class":1191},[1050,5189,5190],{"class":1195},"3. Check for any data inconsistencies",[1050,5192,2829],{"class":1191},[1050,5194,5196],{"class":1052,"line":5195},204,[1050,5197,4969],{"class":1135},[1050,5199,5201],{"class":1052,"line":5200},205,[1050,5202,1331],{"class":1169},[1050,5204,5206],{"class":1052,"line":5205},206,[1050,5207,5208],{"class":1056},"        # Add risks from analysis\n",[1050,5210,5212,5215,5217,5219,5221,5223,5225,5227,5229,5231,5233,5235,5237],{"class":1052,"line":5211},207,[1050,5213,5214],{"class":1169},"        strategy",[1050,5216,3028],{"class":1135},[1050,5218,1192],{"class":1191},[1050,5220,4820],{"class":1195},[1050,5222,1192],{"class":1191},[1050,5224,3149],{"class":1135},[1050,5226,1852],{"class":1135},[1050,5228,4860],{"class":1169},[1050,5230,3028],{"class":1135},[1050,5232,1192],{"class":1191},[1050,5234,2869],{"class":1195},[1050,5236,1192],{"class":1191},[1050,5238,3189],{"class":1135},[1050,5240,5242],{"class":1052,"line":5241},208,[1050,5243,1331],{"class":1169},[1050,5245,5247],{"class":1052,"line":5246},209,[1050,5248,5249],{"class":1056},"        # Add alternative approaches\n",[1050,5251,5253,5255,5257,5259,5261,5263,5265],{"class":1052,"line":5252},210,[1050,5254,2586],{"class":1804},[1050,5256,4860],{"class":1169},[1050,5258,3028],{"class":1135},[1050,5260,1192],{"class":1191},[1050,5262,2898],{"class":1195},[1050,5264,1192],{"class":1191},[1050,5266,3133],{"class":1135},[1050,5268,5270,5272,5274,5276,5278,5280,5282,5284],{"class":1052,"line":5269},211,[1050,5271,4876],{"class":1169},[1050,5273,3028],{"class":1135},[1050,5275,1192],{"class":1191},[1050,5277,4834],{"class":1195},[1050,5279,1192],{"class":1191},[1050,5281,3037],{"class":1135},[1050,5283,3171],{"class":1250},[1050,5285,4916],{"class":1135},[1050,5287,5289,5291,5294,5296],{"class":1052,"line":5288},212,[1050,5290,4922],{"class":1191},[1050,5292,5293],{"class":1195},"Create new forward migration to undo changes",[1050,5295,1631],{"class":1191},[1050,5297,1273],{"class":1135},[1050,5299,5301,5303,5306,5308],{"class":1052,"line":5300},213,[1050,5302,4922],{"class":1191},[1050,5304,5305],{"class":1195},"Restore from backup instead of rollback",[1050,5307,1631],{"class":1191},[1050,5309,1273],{"class":1135},[1050,5311,5313,5315,5318],{"class":1052,"line":5312},214,[1050,5314,4922],{"class":1191},[1050,5316,5317],{"class":1195},"Manual database modifications",[1050,5319,2829],{"class":1191},[1050,5321,5323],{"class":1052,"line":5322},215,[1050,5324,4969],{"class":1135},[1050,5326,5328],{"class":1052,"line":5327},216,[1050,5329,1331],{"class":1169},[1050,5331,5333,5335],{"class":1052,"line":5332},217,[1050,5334,3307],{"class":1804},[1050,5336,5337],{"class":1169}," strategy\n",[1030,5339,5341],{"id":5340},"data-preservation-during-rollbacks","Data Preservation During Rollbacks",[1035,5343,5345],{"id":5344},"safe-rollback-patterns","Safe Rollback Patterns",[1040,5347,5349],{"className":1042,"code":5348,"language":1044,"meta":1045,"style":1045},"class SafeRollbackPatterns:\n    \"\"\"Patterns for safe migration rollbacks\"\"\"\n    \n    @staticmethod\n    def create_data_preservation_migration():\n        \"\"\"Create migration that preserves data during rollback\"\"\"\n        \n        class Migration(migrations.Migration):\n            dependencies = [\n                ('blog', '0006_complex_changes'),\n            ]\n            \n            operations = [\n                # Step 1: Create backup table before making changes\n                migrations.RunSQL(\n                    sql=\"CREATE TABLE blog_post_backup AS SELECT * FROM blog_post;\",\n                    reverse_sql=\"DROP TABLE IF EXISTS blog_post_backup;\",\n                ),\n                \n                # Step 2: Make the actual changes\n                migrations.AddField(\n                    model_name='post',\n                    name='new_field',\n                    field=models.CharField(max_length=100, null=True),\n                ),\n                \n                # Step 3: Populate new field\n                migrations.RunPython(\n                    code=populate_new_field,\n                    reverse_code=restore_from_backup,\n                ),\n                \n                # Step 4: Clean up backup table (optional)\n                migrations.RunSQL(\n                    sql=\"-- Keep backup table for safety\",\n                    reverse_sql=\"-- Backup table will be dropped by step 1 reverse\",\n                ),\n            ]\n    \n    @staticmethod\n    def two_phase_rollback_migration():\n        \"\"\"Two-phase migration for safer rollbacks\"\"\"\n        \n        # Phase 1: Prepare for rollback\n        class PreparationMigration(migrations.Migration):\n            dependencies = [\n                ('blog', '0007_data_preservation'),\n            ]\n            \n            operations = [\n                # Add new field as nullable first\n                migrations.AddField(\n                    model_name='post',\n                    name='status_new',\n                    field=models.CharField(max_length=20, null=True),\n                ),\n                \n                # Copy data to new field\n                migrations.RunPython(\n                    code=copy_status_to_new_field,\n                    reverse_code=clear_new_status_field,\n                ),\n            ]\n        \n        # Phase 2: Complete the change\n        class CompletionMigration(migrations.Migration):\n            dependencies = [\n                ('blog', '0008_preparation'),\n            ]\n            \n            operations = [\n                # Remove old field\n                migrations.RemoveField(\n                    model_name='post',\n                    name='status',\n                ),\n                \n                # Rename new field to final name\n                migrations.RenameField(\n                    model_name='post',\n                    old_name='status_new',\n                    new_name='status',\n                ),\n                \n                # Make field non-nullable\n                migrations.AlterField(\n                    model_name='post',\n                    name='status',\n                    field=models.CharField(max_length=20),\n                ),\n            ]\n    \n    @staticmethod\n    def conditional_rollback_migration():\n        \"\"\"Migration with conditional rollback behavior\"\"\"\n        \n        def smart_rollback(apps, schema_editor):\n            \"\"\"Rollback that preserves data when possible\"\"\"\n            \n            Post = apps.get_model('blog', 'Post')\n            \n            # Check if we can preserve data\n            posts_with_new_data = Post.objects.filter(\n                new_field__isnull=False\n            ).count()\n            \n            if posts_with_new_data > 0:\n                # Create backup before rollback\n                backup_data = list(Post.objects.values(\n                    'id', 'new_field'\n                ))\n                \n                # Store backup in cache or temporary table\n                from django.core.cache import cache\n                cache.set('rollback_backup_new_field', backup_data, timeout=3600)\n                \n                print(f\"Backed up {len(backup_data)} records before rollback\")\n            \n            # Clear the field for safe rollback\n            Post.objects.update(new_field=None)\n        \n        class Migration(migrations.Migration):\n            dependencies = [\n                ('blog', '0009_completion'),\n            ]\n            \n            operations = [\n                migrations.RunPython(\n                    code=populate_advanced_field,\n                    reverse_code=smart_rollback,\n                ),\n            ]\n\ndef populate_new_field(apps, schema_editor):\n    \"\"\"Populate new field with data\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    for post in Post.objects.all():\n        post.new_field = f\"generated_{post.id}\"\n        post.save()\n\ndef restore_from_backup(apps, schema_editor):\n    \"\"\"Restore data from backup table\"\"\"\n    from django.db import connection\n    \n    with connection.cursor() as cursor:\n        # Restore from backup table\n        cursor.execute(\"\"\"\n            UPDATE blog_post \n            SET title = backup.title,\n                content = backup.content\n            FROM blog_post_backup backup\n            WHERE blog_post.id = backup.id\n        \"\"\")\n\ndef copy_status_to_new_field(apps, schema_editor):\n    \"\"\"Copy status to new field\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    Post.objects.update(status_new=F('status'))\n\ndef clear_new_status_field(apps, schema_editor):\n    \"\"\"Clear new status field\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    Post.objects.update(status_new=None)\n\ndef populate_advanced_field(apps, schema_editor):\n    \"\"\"Populate advanced field\"\"\"\n    Post = apps.get_model('blog', 'Post')\n    \n    for post in Post.objects.all():\n        post.advanced_field = calculate_advanced_value(post)\n        post.save()\n\ndef calculate_advanced_value(post):\n    \"\"\"Calculate advanced value for post\"\"\"\n    return f\"advanced_{post.id}_{len(post.title)}\"\n",[1047,5350,5351,5360,5369,5373,5381,5390,5399,5403,5420,5429,5451,5456,5460,5469,5474,5485,5501,5517,5522,5527,5532,5542,5557,5573,5606,5610,5614,5619,5629,5641,5653,5657,5661,5666,5676,5691,5706,5710,5714,5718,5724,5733,5742,5746,5751,5768,5776,5797,5801,5805,5813,5818,5828,5842,5857,5888,5892,5896,5901,5911,5922,5933,5937,5941,5945,5950,5967,5975,5996,6000,6004,6012,6017,6027,6041,6056,6060,6064,6069,6080,6094,6109,6124,6128,6132,6137,6147,6161,6175,6197,6201,6205,6209,6215,6224,6233,6237,6255,6265,6269,6300,6304,6309,6328,6338,6348,6352,6367,6372,6397,6415,6420,6424,6429,6451,6487,6491,6523,6527,6532,6555,6559,6575,6583,6604,6608,6612,6620,6630,6641,6652,6656,6660,6664,6681,6690,6720,6724,6744,6771,6781,6785,6802,6811,6828,6832,6855,6860,6874,6879,6884,6889,6894,6899,6905,6909,6926,6935,6965,6969,7001,7005,7022,7031,7061,7065,7087,7091,7108,7117,7147,7151,7171,7191,7201,7205,7217,7226],{"__ignoreMap":1045},[1050,5352,5353,5355,5358],{"class":1052,"line":1053},[1050,5354,1128],{"class":1127},[1050,5356,5357],{"class":1131}," SafeRollbackPatterns",[1050,5359,2415],{"class":1135},[1050,5361,5362,5364,5367],{"class":1052,"line":1060},[1050,5363,1156],{"class":1155},[1050,5365,5366],{"class":1159},"Patterns for safe migration rollbacks",[1050,5368,1163],{"class":1155},[1050,5370,5371],{"class":1052,"line":1067},[1050,5372,1170],{"class":1169},[1050,5374,5375,5378],{"class":1052,"line":1073},[1050,5376,5377],{"class":1135},"    @",[1050,5379,5380],{"class":2775},"staticmethod\n",[1050,5382,5383,5385,5388],{"class":1052,"line":1079},[1050,5384,2433],{"class":1127},[1050,5386,5387],{"class":1733}," create_data_preservation_migration",[1050,5389,2354],{"class":1135},[1050,5391,5392,5394,5397],{"class":1052,"line":1084},[1050,5393,2528],{"class":1155},[1050,5395,5396],{"class":1159},"Create migration that preserves data during rollback",[1050,5398,1163],{"class":1155},[1050,5400,5401],{"class":1052,"line":1090},[1050,5402,1331],{"class":1169},[1050,5404,5405,5408,5410,5412,5414,5416,5418],{"class":1052,"line":1096},[1050,5406,5407],{"class":1127},"        class",[1050,5409,1132],{"class":1131},[1050,5411,1136],{"class":1135},[1050,5413,1140],{"class":1139},[1050,5415,1143],{"class":1135},[1050,5417,1146],{"class":1139},[1050,5419,1149],{"class":1135},[1050,5421,5422,5425,5427],{"class":1052,"line":1101},[1050,5423,5424],{"class":1169},"            dependencies ",[1050,5426,1179],{"class":1135},[1050,5428,1182],{"class":1135},[1050,5430,5431,5434,5436,5438,5440,5442,5444,5447,5449],{"class":1052,"line":1107},[1050,5432,5433],{"class":1135},"                (",[1050,5435,1192],{"class":1191},[1050,5437,1196],{"class":1195},[1050,5439,1192],{"class":1191},[1050,5441,1201],{"class":1135},[1050,5443,1204],{"class":1191},[1050,5445,5446],{"class":1195},"0006_complex_changes",[1050,5448,1192],{"class":1191},[1050,5450,1212],{"class":1135},[1050,5452,5453],{"class":1052,"line":1113},[1050,5454,5455],{"class":1135},"            ]\n",[1050,5457,5458],{"class":1052,"line":1118},[1050,5459,2995],{"class":1169},[1050,5461,5462,5465,5467],{"class":1052,"line":1124},[1050,5463,5464],{"class":1169},"            operations ",[1050,5466,1179],{"class":1135},[1050,5468,1182],{"class":1135},[1050,5470,5471],{"class":1052,"line":1152},[1050,5472,5473],{"class":1056},"                # Step 1: Create backup table before making changes\n",[1050,5475,5476,5479,5481,5483],{"class":1052,"line":1166},[1050,5477,5478],{"class":1169},"                migrations",[1050,5480,1143],{"class":1135},[1050,5482,1618],{"class":1250},[1050,5484,1254],{"class":1135},[1050,5486,5487,5490,5492,5494,5497,5499],{"class":1052,"line":1173},[1050,5488,5489],{"class":1260},"                    sql",[1050,5491,1179],{"class":1135},[1050,5493,1631],{"class":1191},[1050,5495,5496],{"class":1195},"CREATE TABLE blog_post_backup AS SELECT * FROM blog_post;",[1050,5498,1631],{"class":1191},[1050,5500,1273],{"class":1135},[1050,5502,5503,5506,5508,5510,5513,5515],{"class":1052,"line":1185},[1050,5504,5505],{"class":1260},"                    reverse_sql",[1050,5507,1179],{"class":1135},[1050,5509,1631],{"class":1191},[1050,5511,5512],{"class":1195},"DROP TABLE IF EXISTS blog_post_backup;",[1050,5514,1631],{"class":1191},[1050,5516,1273],{"class":1135},[1050,5518,5519],{"class":1052,"line":1215},[1050,5520,5521],{"class":1135},"                ),\n",[1050,5523,5524],{"class":1052,"line":1221},[1050,5525,5526],{"class":1169},"                \n",[1050,5528,5529],{"class":1052,"line":1226},[1050,5530,5531],{"class":1056},"                # Step 2: Make the actual changes\n",[1050,5533,5534,5536,5538,5540],{"class":1052,"line":1236},[1050,5535,5478],{"class":1169},[1050,5537,1143],{"class":1135},[1050,5539,1251],{"class":1250},[1050,5541,1254],{"class":1135},[1050,5543,5544,5547,5549,5551,5553,5555],{"class":1052,"line":1242},[1050,5545,5546],{"class":1260},"                    model_name",[1050,5548,1179],{"class":1135},[1050,5550,1192],{"class":1191},[1050,5552,1268],{"class":1195},[1050,5554,1192],{"class":1191},[1050,5556,1273],{"class":1135},[1050,5558,5559,5562,5564,5566,5569,5571],{"class":1052,"line":1257},[1050,5560,5561],{"class":1260},"                    name",[1050,5563,1179],{"class":1135},[1050,5565,1192],{"class":1191},[1050,5567,5568],{"class":1195},"new_field",[1050,5570,1192],{"class":1191},[1050,5572,1273],{"class":1135},[1050,5574,5575,5578,5580,5582,5584,5586,5588,5590,5592,5595,5597,5600,5602,5604],{"class":1052,"line":1276},[1050,5576,5577],{"class":1260},"                    field",[1050,5579,1179],{"class":1135},[1050,5581,1301],{"class":1250},[1050,5583,1143],{"class":1135},[1050,5585,1394],{"class":1250},[1050,5587,1136],{"class":1135},[1050,5589,1399],{"class":1260},[1050,5591,1179],{"class":1135},[1050,5593,5594],{"class":1316},"100",[1050,5596,1201],{"class":1135},[1050,5598,5599],{"class":1260}," null",[1050,5601,1179],{"class":1135},[1050,5603,1836],{"class":1835},[1050,5605,1212],{"class":1135},[1050,5607,5608],{"class":1052,"line":1293},[1050,5609,5521],{"class":1135},[1050,5611,5612],{"class":1052,"line":1322},[1050,5613,5526],{"class":1169},[1050,5615,5616],{"class":1052,"line":1328},[1050,5617,5618],{"class":1056},"                # Step 3: Populate new field\n",[1050,5620,5621,5623,5625,5627],{"class":1052,"line":1334},[1050,5622,5478],{"class":1169},[1050,5624,1143],{"class":1135},[1050,5626,1681],{"class":1250},[1050,5628,1254],{"class":1135},[1050,5630,5631,5634,5636,5639],{"class":1052,"line":1340},[1050,5632,5633],{"class":1260},"                    code",[1050,5635,1179],{"class":1135},[1050,5637,5638],{"class":1250},"populate_new_field",[1050,5640,1273],{"class":1135},[1050,5642,5643,5646,5648,5651],{"class":1052,"line":1352},[1050,5644,5645],{"class":1260},"                    reverse_code",[1050,5647,1179],{"class":1135},[1050,5649,5650],{"class":1250},"restore_from_backup",[1050,5652,1273],{"class":1135},[1050,5654,5655],{"class":1052,"line":1367},[1050,5656,5521],{"class":1135},[1050,5658,5659],{"class":1052,"line":1383},[1050,5660,5526],{"class":1169},[1050,5662,5663],{"class":1052,"line":1413},[1050,5664,5665],{"class":1056},"                # Step 4: Clean up backup table (optional)\n",[1050,5667,5668,5670,5672,5674],{"class":1052,"line":1418},[1050,5669,5478],{"class":1169},[1050,5671,1143],{"class":1135},[1050,5673,1618],{"class":1250},[1050,5675,1254],{"class":1135},[1050,5677,5678,5680,5682,5684,5687,5689],{"class":1052,"line":1423},[1050,5679,5489],{"class":1260},[1050,5681,1179],{"class":1135},[1050,5683,1631],{"class":1191},[1050,5685,5686],{"class":1195},"-- Keep backup table for safety",[1050,5688,1631],{"class":1191},[1050,5690,1273],{"class":1135},[1050,5692,5693,5695,5697,5699,5702,5704],{"class":1052,"line":1429},[1050,5694,5505],{"class":1260},[1050,5696,1179],{"class":1135},[1050,5698,1631],{"class":1191},[1050,5700,5701],{"class":1195},"-- Backup table will be dropped by step 1 reverse",[1050,5703,1631],{"class":1191},[1050,5705,1273],{"class":1135},[1050,5707,5708],{"class":1052,"line":1441},[1050,5709,5521],{"class":1135},[1050,5711,5712],{"class":1052,"line":1456},[1050,5713,5455],{"class":1135},[1050,5715,5716],{"class":1052,"line":1502},[1050,5717,1170],{"class":1169},[1050,5719,5720,5722],{"class":1052,"line":1507},[1050,5721,5377],{"class":1135},[1050,5723,5380],{"class":2775},[1050,5725,5726,5728,5731],{"class":1052,"line":1512},[1050,5727,2433],{"class":1127},[1050,5729,5730],{"class":1733}," two_phase_rollback_migration",[1050,5732,2354],{"class":1135},[1050,5734,5735,5737,5740],{"class":1052,"line":1517},[1050,5736,2528],{"class":1155},[1050,5738,5739],{"class":1159},"Two-phase migration for safer rollbacks",[1050,5741,1163],{"class":1155},[1050,5743,5744],{"class":1052,"line":1523},[1050,5745,1331],{"class":1169},[1050,5747,5748],{"class":1052,"line":1540},[1050,5749,5750],{"class":1056},"        # Phase 1: Prepare for rollback\n",[1050,5752,5753,5755,5758,5760,5762,5764,5766],{"class":1052,"line":1550},[1050,5754,5407],{"class":1127},[1050,5756,5757],{"class":1131}," PreparationMigration",[1050,5759,1136],{"class":1135},[1050,5761,1140],{"class":1139},[1050,5763,1143],{"class":1135},[1050,5765,1146],{"class":1139},[1050,5767,1149],{"class":1135},[1050,5769,5770,5772,5774],{"class":1052,"line":1555},[1050,5771,5424],{"class":1169},[1050,5773,1179],{"class":1135},[1050,5775,1182],{"class":1135},[1050,5777,5778,5780,5782,5784,5786,5788,5790,5793,5795],{"class":1052,"line":1564},[1050,5779,5433],{"class":1135},[1050,5781,1192],{"class":1191},[1050,5783,1196],{"class":1195},[1050,5785,1192],{"class":1191},[1050,5787,1201],{"class":1135},[1050,5789,1204],{"class":1191},[1050,5791,5792],{"class":1195},"0007_data_preservation",[1050,5794,1192],{"class":1191},[1050,5796,1212],{"class":1135},[1050,5798,5799],{"class":1052,"line":1586},[1050,5800,5455],{"class":1135},[1050,5802,5803],{"class":1052,"line":1591},[1050,5804,2995],{"class":1169},[1050,5806,5807,5809,5811],{"class":1052,"line":1596},[1050,5808,5464],{"class":1169},[1050,5810,1179],{"class":1135},[1050,5812,1182],{"class":1135},[1050,5814,5815],{"class":1052,"line":1605},[1050,5816,5817],{"class":1056},"                # Add new field as nullable first\n",[1050,5819,5820,5822,5824,5826],{"class":1052,"line":1611},[1050,5821,5478],{"class":1169},[1050,5823,1143],{"class":1135},[1050,5825,1251],{"class":1250},[1050,5827,1254],{"class":1135},[1050,5829,5830,5832,5834,5836,5838,5840],{"class":1052,"line":1623},[1050,5831,5546],{"class":1260},[1050,5833,1179],{"class":1135},[1050,5835,1192],{"class":1191},[1050,5837,1268],{"class":1195},[1050,5839,1192],{"class":1191},[1050,5841,1273],{"class":1135},[1050,5843,5844,5846,5848,5850,5853,5855],{"class":1052,"line":1641},[1050,5845,5561],{"class":1260},[1050,5847,1179],{"class":1135},[1050,5849,1192],{"class":1191},[1050,5851,5852],{"class":1195},"status_new",[1050,5854,1192],{"class":1191},[1050,5856,1273],{"class":1135},[1050,5858,5859,5861,5863,5865,5867,5869,5871,5873,5875,5878,5880,5882,5884,5886],{"class":1052,"line":1658},[1050,5860,5577],{"class":1260},[1050,5862,1179],{"class":1135},[1050,5864,1301],{"class":1250},[1050,5866,1143],{"class":1135},[1050,5868,1394],{"class":1250},[1050,5870,1136],{"class":1135},[1050,5872,1399],{"class":1260},[1050,5874,1179],{"class":1135},[1050,5876,5877],{"class":1316},"20",[1050,5879,1201],{"class":1135},[1050,5881,5599],{"class":1260},[1050,5883,1179],{"class":1135},[1050,5885,1836],{"class":1835},[1050,5887,1212],{"class":1135},[1050,5889,5890],{"class":1052,"line":1663},[1050,5891,5521],{"class":1135},[1050,5893,5894],{"class":1052,"line":1668},[1050,5895,5526],{"class":1169},[1050,5897,5898],{"class":1052,"line":1674},[1050,5899,5900],{"class":1056},"                # Copy data to new field\n",[1050,5902,5903,5905,5907,5909],{"class":1052,"line":1686},[1050,5904,5478],{"class":1169},[1050,5906,1143],{"class":1135},[1050,5908,1681],{"class":1250},[1050,5910,1254],{"class":1135},[1050,5912,5913,5915,5917,5920],{"class":1052,"line":1699},[1050,5914,5633],{"class":1260},[1050,5916,1179],{"class":1135},[1050,5918,5919],{"class":1250},"copy_status_to_new_field",[1050,5921,1273],{"class":1135},[1050,5923,5924,5926,5928,5931],{"class":1052,"line":1712},[1050,5925,5645],{"class":1260},[1050,5927,1179],{"class":1135},[1050,5929,5930],{"class":1250},"clear_new_status_field",[1050,5932,1273],{"class":1135},[1050,5934,5935],{"class":1052,"line":1717},[1050,5936,5521],{"class":1135},[1050,5938,5939],{"class":1052,"line":1722},[1050,5940,5455],{"class":1135},[1050,5942,5943],{"class":1052,"line":1727},[1050,5944,1331],{"class":1169},[1050,5946,5947],{"class":1052,"line":1750},[1050,5948,5949],{"class":1056},"        # Phase 2: Complete the change\n",[1050,5951,5952,5954,5957,5959,5961,5963,5965],{"class":1052,"line":1760},[1050,5953,5407],{"class":1127},[1050,5955,5956],{"class":1131}," CompletionMigration",[1050,5958,1136],{"class":1135},[1050,5960,1140],{"class":1139},[1050,5962,1143],{"class":1135},[1050,5964,1146],{"class":1139},[1050,5966,1149],{"class":1135},[1050,5968,5969,5971,5973],{"class":1052,"line":1796},[1050,5970,5424],{"class":1169},[1050,5972,1179],{"class":1135},[1050,5974,1182],{"class":1135},[1050,5976,5977,5979,5981,5983,5985,5987,5989,5992,5994],{"class":1052,"line":1801},[1050,5978,5433],{"class":1135},[1050,5980,1192],{"class":1191},[1050,5982,1196],{"class":1195},[1050,5984,1192],{"class":1191},[1050,5986,1201],{"class":1135},[1050,5988,1204],{"class":1191},[1050,5990,5991],{"class":1195},"0008_preparation",[1050,5993,1192],{"class":1191},[1050,5995,1212],{"class":1135},[1050,5997,5998],{"class":1052,"line":1841},[1050,5999,5455],{"class":1135},[1050,6001,6002],{"class":1052,"line":1868},[1050,6003,2995],{"class":1169},[1050,6005,6006,6008,6010],{"class":1052,"line":1881},[1050,6007,5464],{"class":1169},[1050,6009,1179],{"class":1135},[1050,6011,1182],{"class":1135},[1050,6013,6014],{"class":1052,"line":1886},[1050,6015,6016],{"class":1056},"                # Remove old field\n",[1050,6018,6019,6021,6023,6025],{"class":1052,"line":1904},[1050,6020,5478],{"class":1169},[1050,6022,1143],{"class":1135},[1050,6024,2102],{"class":1250},[1050,6026,1254],{"class":1135},[1050,6028,6029,6031,6033,6035,6037,6039],{"class":1052,"line":1914},[1050,6030,5546],{"class":1260},[1050,6032,1179],{"class":1135},[1050,6034,1192],{"class":1191},[1050,6036,1268],{"class":1195},[1050,6038,1192],{"class":1191},[1050,6040,1273],{"class":1135},[1050,6042,6043,6045,6047,6049,6052,6054],{"class":1052,"line":1945},[1050,6044,5561],{"class":1260},[1050,6046,1179],{"class":1135},[1050,6048,1192],{"class":1191},[1050,6050,6051],{"class":1195},"status",[1050,6053,1192],{"class":1191},[1050,6055,1273],{"class":1135},[1050,6057,6058],{"class":1052,"line":1950},[1050,6059,5521],{"class":1135},[1050,6061,6062],{"class":1052,"line":1956},[1050,6063,5526],{"class":1169},[1050,6065,6066],{"class":1052,"line":1996},[1050,6067,6068],{"class":1056},"                # Rename new field to final name\n",[1050,6070,6071,6073,6075,6078],{"class":1052,"line":2001},[1050,6072,5478],{"class":1169},[1050,6074,1143],{"class":1135},[1050,6076,6077],{"class":1250},"RenameField",[1050,6079,1254],{"class":1135},[1050,6081,6082,6084,6086,6088,6090,6092],{"class":1052,"line":2007},[1050,6083,5546],{"class":1260},[1050,6085,1179],{"class":1135},[1050,6087,1192],{"class":1191},[1050,6089,1268],{"class":1195},[1050,6091,1192],{"class":1191},[1050,6093,1273],{"class":1135},[1050,6095,6096,6099,6101,6103,6105,6107],{"class":1052,"line":2024},[1050,6097,6098],{"class":1260},"                    old_name",[1050,6100,1179],{"class":1135},[1050,6102,1192],{"class":1191},[1050,6104,5852],{"class":1195},[1050,6106,1192],{"class":1191},[1050,6108,1273],{"class":1135},[1050,6110,6111,6114,6116,6118,6120,6122],{"class":1052,"line":2034},[1050,6112,6113],{"class":1260},"                    new_name",[1050,6115,1179],{"class":1135},[1050,6117,1192],{"class":1191},[1050,6119,6051],{"class":1195},[1050,6121,1192],{"class":1191},[1050,6123,1273],{"class":1135},[1050,6125,6126],{"class":1052,"line":2039},[1050,6127,5521],{"class":1135},[1050,6129,6130],{"class":1052,"line":2048},[1050,6131,5526],{"class":1169},[1050,6133,6134],{"class":1052,"line":2070},[1050,6135,6136],{"class":1056},"                # Make field non-nullable\n",[1050,6138,6139,6141,6143,6145],{"class":1052,"line":2075},[1050,6140,5478],{"class":1169},[1050,6142,1143],{"class":1135},[1050,6144,1347],{"class":1250},[1050,6146,1254],{"class":1135},[1050,6148,6149,6151,6153,6155,6157,6159],{"class":1052,"line":2080},[1050,6150,5546],{"class":1260},[1050,6152,1179],{"class":1135},[1050,6154,1192],{"class":1191},[1050,6156,1268],{"class":1195},[1050,6158,1192],{"class":1191},[1050,6160,1273],{"class":1135},[1050,6162,6163,6165,6167,6169,6171,6173],{"class":1052,"line":2089},[1050,6164,5561],{"class":1260},[1050,6166,1179],{"class":1135},[1050,6168,1192],{"class":1191},[1050,6170,6051],{"class":1195},[1050,6172,1192],{"class":1191},[1050,6174,1273],{"class":1135},[1050,6176,6177,6179,6181,6183,6185,6187,6189,6191,6193,6195],{"class":1052,"line":2095},[1050,6178,5577],{"class":1260},[1050,6180,1179],{"class":1135},[1050,6182,1301],{"class":1250},[1050,6184,1143],{"class":1135},[1050,6186,1394],{"class":1250},[1050,6188,1136],{"class":1135},[1050,6190,1399],{"class":1260},[1050,6192,1179],{"class":1135},[1050,6194,5877],{"class":1316},[1050,6196,1212],{"class":1135},[1050,6198,6199],{"class":1052,"line":2107},[1050,6200,5521],{"class":1135},[1050,6202,6203],{"class":1052,"line":2122},[1050,6204,5455],{"class":1135},[1050,6206,6207],{"class":1052,"line":2138},[1050,6208,1170],{"class":1169},[1050,6210,6211,6213],{"class":1052,"line":2143},[1050,6212,5377],{"class":1135},[1050,6214,5380],{"class":2775},[1050,6216,6217,6219,6222],{"class":1052,"line":2148},[1050,6218,2433],{"class":1127},[1050,6220,6221],{"class":1733}," conditional_rollback_migration",[1050,6223,2354],{"class":1135},[1050,6225,6226,6228,6231],{"class":1052,"line":2154},[1050,6227,2528],{"class":1155},[1050,6229,6230],{"class":1159},"Migration with conditional rollback behavior",[1050,6232,1163],{"class":1155},[1050,6234,6235],{"class":1052,"line":2165},[1050,6236,1331],{"class":1169},[1050,6238,6239,6242,6245,6247,6249,6251,6253],{"class":1052,"line":2177},[1050,6240,6241],{"class":1127},"        def",[1050,6243,6244],{"class":1733}," smart_rollback",[1050,6246,1136],{"class":1135},[1050,6248,1740],{"class":1739},[1050,6250,1201],{"class":1135},[1050,6252,1745],{"class":1739},[1050,6254,1149],{"class":1135},[1050,6256,6257,6260,6263],{"class":1052,"line":2200},[1050,6258,6259],{"class":1155},"            \"\"\"",[1050,6261,6262],{"class":1159},"Rollback that preserves data when possible",[1050,6264,1163],{"class":1155},[1050,6266,6267],{"class":1052,"line":2205},[1050,6268,2995],{"class":1169},[1050,6270,6271,6274,6276,6278,6280,6282,6284,6286,6288,6290,6292,6294,6296,6298],{"class":1052,"line":2210},[1050,6272,6273],{"class":1169},"            Post ",[1050,6275,1179],{"class":1135},[1050,6277,1768],{"class":1169},[1050,6279,1143],{"class":1135},[1050,6281,1773],{"class":1250},[1050,6283,1136],{"class":1135},[1050,6285,1192],{"class":1191},[1050,6287,1196],{"class":1195},[1050,6289,1192],{"class":1191},[1050,6291,1201],{"class":1135},[1050,6293,1204],{"class":1191},[1050,6295,1788],{"class":1195},[1050,6297,1192],{"class":1191},[1050,6299,1793],{"class":1135},[1050,6301,6302],{"class":1052,"line":2216},[1050,6303,2995],{"class":1169},[1050,6305,6306],{"class":1052,"line":2227},[1050,6307,6308],{"class":1056},"            # Check if we can preserve data\n",[1050,6310,6311,6314,6316,6318,6320,6322,6324,6326],{"class":1052,"line":2243},[1050,6312,6313],{"class":1169},"            posts_with_new_data ",[1050,6315,1179],{"class":1135},[1050,6317,1814],{"class":1169},[1050,6319,1143],{"class":1135},[1050,6321,1820],{"class":1819},[1050,6323,1143],{"class":1135},[1050,6325,1825],{"class":1250},[1050,6327,1254],{"class":1135},[1050,6329,6330,6333,6335],{"class":1052,"line":2249},[1050,6331,6332],{"class":1260},"                new_field__isnull",[1050,6334,1179],{"class":1135},[1050,6336,6337],{"class":1835},"False\n",[1050,6339,6340,6343,6346],{"class":1052,"line":2254},[1050,6341,6342],{"class":1135},"            ).",[1050,6344,6345],{"class":1250},"count",[1050,6347,1878],{"class":1135},[1050,6349,6350],{"class":1052,"line":2259},[1050,6351,2995],{"class":1169},[1050,6353,6354,6356,6359,6362,6365],{"class":1052,"line":2264},[1050,6355,2974],{"class":1804},[1050,6357,6358],{"class":1169}," posts_with_new_data ",[1050,6360,6361],{"class":2592},">",[1050,6363,6364],{"class":1316}," 0",[1050,6366,2415],{"class":1135},[1050,6368,6369],{"class":1052,"line":2282},[1050,6370,6371],{"class":1056},"                # Create backup before rollback\n",[1050,6373,6374,6377,6379,6382,6384,6386,6388,6390,6392,6395],{"class":1052,"line":2292},[1050,6375,6376],{"class":1169},"                backup_data ",[1050,6378,1179],{"class":1135},[1050,6380,6381],{"class":2775}," list",[1050,6383,1136],{"class":1135},[1050,6385,1788],{"class":1250},[1050,6387,1143],{"class":1135},[1050,6389,1820],{"class":1819},[1050,6391,1143],{"class":1135},[1050,6393,6394],{"class":1250},"values",[1050,6396,1254],{"class":1135},[1050,6398,6399,6402,6405,6407,6409,6411,6413],{"class":1052,"line":2323},[1050,6400,6401],{"class":1191},"                    '",[1050,6403,6404],{"class":1195},"id",[1050,6406,1192],{"class":1191},[1050,6408,1201],{"class":1135},[1050,6410,1204],{"class":1191},[1050,6412,5568],{"class":1195},[1050,6414,4896],{"class":1191},[1050,6416,6417],{"class":1052,"line":2328},[1050,6418,6419],{"class":1135},"                ))\n",[1050,6421,6422],{"class":1052,"line":2334},[1050,6423,5526],{"class":1169},[1050,6425,6426],{"class":1052,"line":2357},[1050,6427,6428],{"class":1056},"                # Store backup in cache or temporary table\n",[1050,6430,6431,6434,6436,6438,6441,6443,6446,6448],{"class":1052,"line":2363},[1050,6432,6433],{"class":1804},"                from",[1050,6435,2453],{"class":1169},[1050,6437,1143],{"class":1135},[1050,6439,6440],{"class":1169},"core",[1050,6442,1143],{"class":1135},[1050,6444,6445],{"class":1169},"cache ",[1050,6447,2470],{"class":1804},[1050,6449,6450],{"class":1169}," cache\n",[1050,6452,6453,6456,6458,6461,6463,6465,6468,6470,6472,6475,6477,6480,6482,6485],{"class":1052,"line":2388},[1050,6454,6455],{"class":1169},"                cache",[1050,6457,1143],{"class":1135},[1050,6459,6460],{"class":1250},"set",[1050,6462,1136],{"class":1135},[1050,6464,1192],{"class":1191},[1050,6466,6467],{"class":1195},"rollback_backup_new_field",[1050,6469,1192],{"class":1191},[1050,6471,1201],{"class":1135},[1050,6473,6474],{"class":1250}," backup_data",[1050,6476,1201],{"class":1135},[1050,6478,6479],{"class":1260}," timeout",[1050,6481,1179],{"class":1135},[1050,6483,6484],{"class":1316},"3600",[1050,6486,1793],{"class":1135},[1050,6488,6489],{"class":1052,"line":3933},[1050,6490,5526],{"class":1169},[1050,6492,6493,6496,6498,6501,6504,6506,6509,6511,6514,6516,6518,6521],{"class":1052,"line":3955},[1050,6494,6495],{"class":2436},"                print",[1050,6497,1136],{"class":1135},[1050,6499,6500],{"class":1127},"f",[1050,6502,6503],{"class":1195},"\"Backed up ",[1050,6505,2661],{"class":2660},[1050,6507,6508],{"class":2436},"len",[1050,6510,1136],{"class":1135},[1050,6512,6513],{"class":1250},"backup_data",[1050,6515,4391],{"class":1135},[1050,6517,2666],{"class":2660},[1050,6519,6520],{"class":1195}," records before rollback\"",[1050,6522,1793],{"class":1135},[1050,6524,6525],{"class":1052,"line":3974},[1050,6526,2995],{"class":1169},[1050,6528,6529],{"class":1052,"line":3995},[1050,6530,6531],{"class":1056},"            # Clear the field for safe rollback\n",[1050,6533,6534,6537,6539,6541,6543,6545,6547,6549,6551,6553],{"class":1052,"line":4000},[1050,6535,6536],{"class":1169},"            Post",[1050,6538,1143],{"class":1135},[1050,6540,1820],{"class":1819},[1050,6542,1143],{"class":1135},[1050,6544,1982],{"class":1250},[1050,6546,1136],{"class":1135},[1050,6548,5568],{"class":1260},[1050,6550,1179],{"class":1135},[1050,6552,1991],{"class":1835},[1050,6554,1793],{"class":1135},[1050,6556,6557],{"class":1052,"line":4005},[1050,6558,1331],{"class":1169},[1050,6560,6561,6563,6565,6567,6569,6571,6573],{"class":1052,"line":4022},[1050,6562,5407],{"class":1127},[1050,6564,1132],{"class":1131},[1050,6566,1136],{"class":1135},[1050,6568,1140],{"class":1139},[1050,6570,1143],{"class":1135},[1050,6572,1146],{"class":1139},[1050,6574,1149],{"class":1135},[1050,6576,6577,6579,6581],{"class":1052,"line":4041},[1050,6578,5424],{"class":1169},[1050,6580,1179],{"class":1135},[1050,6582,1182],{"class":1135},[1050,6584,6585,6587,6589,6591,6593,6595,6597,6600,6602],{"class":1052,"line":4060},[1050,6586,5433],{"class":1135},[1050,6588,1192],{"class":1191},[1050,6590,1196],{"class":1195},[1050,6592,1192],{"class":1191},[1050,6594,1201],{"class":1135},[1050,6596,1204],{"class":1191},[1050,6598,6599],{"class":1195},"0009_completion",[1050,6601,1192],{"class":1191},[1050,6603,1212],{"class":1135},[1050,6605,6606],{"class":1052,"line":4081},[1050,6607,5455],{"class":1135},[1050,6609,6610],{"class":1052,"line":4086},[1050,6611,2995],{"class":1169},[1050,6613,6614,6616,6618],{"class":1052,"line":4109},[1050,6615,5464],{"class":1169},[1050,6617,1179],{"class":1135},[1050,6619,1182],{"class":1135},[1050,6621,6622,6624,6626,6628],{"class":1052,"line":4140},[1050,6623,5478],{"class":1169},[1050,6625,1143],{"class":1135},[1050,6627,1681],{"class":1250},[1050,6629,1254],{"class":1135},[1050,6631,6632,6634,6636,6639],{"class":1052,"line":4145},[1050,6633,5633],{"class":1260},[1050,6635,1179],{"class":1135},[1050,6637,6638],{"class":1250},"populate_advanced_field",[1050,6640,1273],{"class":1135},[1050,6642,6643,6645,6647,6650],{"class":1052,"line":4162},[1050,6644,5645],{"class":1260},[1050,6646,1179],{"class":1135},[1050,6648,6649],{"class":1250},"smart_rollback",[1050,6651,1273],{"class":1135},[1050,6653,6654],{"class":1052,"line":4184},[1050,6655,5521],{"class":1135},[1050,6657,6658],{"class":1052,"line":4203},[1050,6659,5455],{"class":1135},[1050,6661,6662],{"class":1052,"line":4224},[1050,6663,1064],{"emptyLinePlaceholder":1063},[1050,6665,6666,6668,6671,6673,6675,6677,6679],{"class":1052,"line":4229},[1050,6667,1730],{"class":1127},[1050,6669,6670],{"class":1733}," populate_new_field",[1050,6672,1136],{"class":1135},[1050,6674,1740],{"class":1739},[1050,6676,1201],{"class":1135},[1050,6678,1745],{"class":1739},[1050,6680,1149],{"class":1135},[1050,6682,6683,6685,6688],{"class":1052,"line":4234},[1050,6684,1156],{"class":1155},[1050,6686,6687],{"class":1159},"Populate new field with data",[1050,6689,1163],{"class":1155},[1050,6691,6692,6694,6696,6698,6700,6702,6704,6706,6708,6710,6712,6714,6716,6718],{"class":1052,"line":4251},[1050,6693,1763],{"class":1169},[1050,6695,1179],{"class":1135},[1050,6697,1768],{"class":1169},[1050,6699,1143],{"class":1135},[1050,6701,1773],{"class":1250},[1050,6703,1136],{"class":1135},[1050,6705,1192],{"class":1191},[1050,6707,1196],{"class":1195},[1050,6709,1192],{"class":1191},[1050,6711,1201],{"class":1135},[1050,6713,1204],{"class":1191},[1050,6715,1788],{"class":1195},[1050,6717,1192],{"class":1191},[1050,6719,1793],{"class":1135},[1050,6721,6722],{"class":1052,"line":4270},[1050,6723,1170],{"class":1169},[1050,6725,6726,6728,6730,6732,6734,6736,6738,6740,6742],{"class":1052,"line":4290},[1050,6727,1805],{"class":1804},[1050,6729,1808],{"class":1169},[1050,6731,1811],{"class":1804},[1050,6733,1814],{"class":1169},[1050,6735,1143],{"class":1135},[1050,6737,1820],{"class":1819},[1050,6739,1143],{"class":1135},[1050,6741,2351],{"class":1250},[1050,6743,2354],{"class":1135},[1050,6745,6746,6748,6750,6752,6754,6756,6759,6761,6763,6765,6767,6769],{"class":1052,"line":4295},[1050,6747,1844],{"class":1169},[1050,6749,1143],{"class":1135},[1050,6751,5568],{"class":1819},[1050,6753,1852],{"class":1135},[1050,6755,2654],{"class":1127},[1050,6757,6758],{"class":1195},"\"generated_",[1050,6760,2661],{"class":2660},[1050,6762,1268],{"class":1169},[1050,6764,1143],{"class":1135},[1050,6766,6404],{"class":1819},[1050,6768,2666],{"class":2660},[1050,6770,2829],{"class":1195},[1050,6772,6773,6775,6777,6779],{"class":1052,"line":4316},[1050,6774,1844],{"class":1169},[1050,6776,1143],{"class":1135},[1050,6778,1875],{"class":1250},[1050,6780,1878],{"class":1135},[1050,6782,6783],{"class":1052,"line":4347},[1050,6784,1064],{"emptyLinePlaceholder":1063},[1050,6786,6787,6789,6792,6794,6796,6798,6800],{"class":1052,"line":4352},[1050,6788,1730],{"class":1127},[1050,6790,6791],{"class":1733}," restore_from_backup",[1050,6793,1136],{"class":1135},[1050,6795,1740],{"class":1739},[1050,6797,1201],{"class":1135},[1050,6799,1745],{"class":1739},[1050,6801,1149],{"class":1135},[1050,6803,6804,6806,6809],{"class":1052,"line":4369},[1050,6805,1156],{"class":1155},[1050,6807,6808],{"class":1159},"Restore data from backup table",[1050,6810,1163],{"class":1155},[1050,6812,6813,6816,6818,6820,6823,6825],{"class":1052,"line":4407},[1050,6814,6815],{"class":1804},"    from",[1050,6817,2453],{"class":1169},[1050,6819,1143],{"class":1135},[1050,6821,6822],{"class":1169},"db ",[1050,6824,2470],{"class":1804},[1050,6826,6827],{"class":1169}," connection\n",[1050,6829,6830],{"class":1052,"line":4426},[1050,6831,1170],{"class":1169},[1050,6833,6834,6837,6840,6842,6845,6848,6850,6853],{"class":1052,"line":4445},[1050,6835,6836],{"class":1804},"    with",[1050,6838,6839],{"class":1169}," connection",[1050,6841,1143],{"class":1135},[1050,6843,6844],{"class":1250},"cursor",[1050,6846,6847],{"class":1135},"()",[1050,6849,2779],{"class":1804},[1050,6851,6852],{"class":1169}," cursor",[1050,6854,2415],{"class":1135},[1050,6856,6857],{"class":1052,"line":4454},[1050,6858,6859],{"class":1056},"        # Restore from backup table\n",[1050,6861,6862,6865,6867,6870,6872],{"class":1052,"line":4459},[1050,6863,6864],{"class":1169},"        cursor",[1050,6866,1143],{"class":1135},[1050,6868,6869],{"class":1250},"execute",[1050,6871,1136],{"class":1135},[1050,6873,1163],{"class":1191},[1050,6875,6876],{"class":1052,"line":4467},[1050,6877,6878],{"class":1195},"            UPDATE blog_post \n",[1050,6880,6881],{"class":1052,"line":4486},[1050,6882,6883],{"class":1195},"            SET title = backup.title,\n",[1050,6885,6886],{"class":1052,"line":4497},[1050,6887,6888],{"class":1195},"                content = backup.content\n",[1050,6890,6891],{"class":1052,"line":4502},[1050,6892,6893],{"class":1195},"            FROM blog_post_backup backup\n",[1050,6895,6896],{"class":1052,"line":4507},[1050,6897,6898],{"class":1195},"            WHERE blog_post.id = backup.id\n",[1050,6900,6901,6903],{"class":1052,"line":4524},[1050,6902,2528],{"class":1191},[1050,6904,1793],{"class":1135},[1050,6906,6907],{"class":1052,"line":4555},[1050,6908,1064],{"emptyLinePlaceholder":1063},[1050,6910,6911,6913,6916,6918,6920,6922,6924],{"class":1052,"line":4581},[1050,6912,1730],{"class":1127},[1050,6914,6915],{"class":1733}," copy_status_to_new_field",[1050,6917,1136],{"class":1135},[1050,6919,1740],{"class":1739},[1050,6921,1201],{"class":1135},[1050,6923,1745],{"class":1739},[1050,6925,1149],{"class":1135},[1050,6927,6928,6930,6933],{"class":1052,"line":4600},[1050,6929,1156],{"class":1155},[1050,6931,6932],{"class":1159},"Copy status to new field",[1050,6934,1163],{"class":1155},[1050,6936,6937,6939,6941,6943,6945,6947,6949,6951,6953,6955,6957,6959,6961,6963],{"class":1052,"line":4619},[1050,6938,1763],{"class":1169},[1050,6940,1179],{"class":1135},[1050,6942,1768],{"class":1169},[1050,6944,1143],{"class":1135},[1050,6946,1773],{"class":1250},[1050,6948,1136],{"class":1135},[1050,6950,1192],{"class":1191},[1050,6952,1196],{"class":1195},[1050,6954,1192],{"class":1191},[1050,6956,1201],{"class":1135},[1050,6958,1204],{"class":1191},[1050,6960,1788],{"class":1195},[1050,6962,1192],{"class":1191},[1050,6964,1793],{"class":1135},[1050,6966,6967],{"class":1052,"line":4627},[1050,6968,1170],{"class":1169},[1050,6970,6971,6973,6975,6977,6979,6981,6983,6985,6987,6990,6992,6994,6996,6998],{"class":1052,"line":4632},[1050,6972,1959],{"class":1169},[1050,6974,1143],{"class":1135},[1050,6976,1820],{"class":1819},[1050,6978,1143],{"class":1135},[1050,6980,1982],{"class":1250},[1050,6982,1136],{"class":1135},[1050,6984,5852],{"class":1260},[1050,6986,1179],{"class":1135},[1050,6988,6989],{"class":1250},"F",[1050,6991,1136],{"class":1135},[1050,6993,1192],{"class":1191},[1050,6995,6051],{"class":1195},[1050,6997,1192],{"class":1191},[1050,6999,7000],{"class":1135},"))\n",[1050,7002,7003],{"class":1052,"line":4639},[1050,7004,1064],{"emptyLinePlaceholder":1063},[1050,7006,7007,7009,7012,7014,7016,7018,7020],{"class":1052,"line":4658},[1050,7008,1730],{"class":1127},[1050,7010,7011],{"class":1733}," clear_new_status_field",[1050,7013,1136],{"class":1135},[1050,7015,1740],{"class":1739},[1050,7017,1201],{"class":1135},[1050,7019,1745],{"class":1739},[1050,7021,1149],{"class":1135},[1050,7023,7024,7026,7029],{"class":1052,"line":4668},[1050,7025,1156],{"class":1155},[1050,7027,7028],{"class":1159},"Clear new status field",[1050,7030,1163],{"class":1155},[1050,7032,7033,7035,7037,7039,7041,7043,7045,7047,7049,7051,7053,7055,7057,7059],{"class":1052,"line":4673},[1050,7034,1763],{"class":1169},[1050,7036,1179],{"class":1135},[1050,7038,1768],{"class":1169},[1050,7040,1143],{"class":1135},[1050,7042,1773],{"class":1250},[1050,7044,1136],{"class":1135},[1050,7046,1192],{"class":1191},[1050,7048,1196],{"class":1195},[1050,7050,1192],{"class":1191},[1050,7052,1201],{"class":1135},[1050,7054,1204],{"class":1191},[1050,7056,1788],{"class":1195},[1050,7058,1192],{"class":1191},[1050,7060,1793],{"class":1135},[1050,7062,7063],{"class":1052,"line":4678},[1050,7064,1170],{"class":1169},[1050,7066,7067,7069,7071,7073,7075,7077,7079,7081,7083,7085],{"class":1052,"line":4685},[1050,7068,1959],{"class":1169},[1050,7070,1143],{"class":1135},[1050,7072,1820],{"class":1819},[1050,7074,1143],{"class":1135},[1050,7076,1982],{"class":1250},[1050,7078,1136],{"class":1135},[1050,7080,5852],{"class":1260},[1050,7082,1179],{"class":1135},[1050,7084,1991],{"class":1835},[1050,7086,1793],{"class":1135},[1050,7088,7089],{"class":1052,"line":4690},[1050,7090,1064],{"emptyLinePlaceholder":1063},[1050,7092,7093,7095,7098,7100,7102,7104,7106],{"class":1052,"line":4712},[1050,7094,1730],{"class":1127},[1050,7096,7097],{"class":1733}," populate_advanced_field",[1050,7099,1136],{"class":1135},[1050,7101,1740],{"class":1739},[1050,7103,1201],{"class":1135},[1050,7105,1745],{"class":1739},[1050,7107,1149],{"class":1135},[1050,7109,7110,7112,7115],{"class":1052,"line":4722},[1050,7111,1156],{"class":1155},[1050,7113,7114],{"class":1159},"Populate advanced field",[1050,7116,1163],{"class":1155},[1050,7118,7119,7121,7123,7125,7127,7129,7131,7133,7135,7137,7139,7141,7143,7145],{"class":1052,"line":4727},[1050,7120,1763],{"class":1169},[1050,7122,1179],{"class":1135},[1050,7124,1768],{"class":1169},[1050,7126,1143],{"class":1135},[1050,7128,1773],{"class":1250},[1050,7130,1136],{"class":1135},[1050,7132,1192],{"class":1191},[1050,7134,1196],{"class":1195},[1050,7136,1192],{"class":1191},[1050,7138,1201],{"class":1135},[1050,7140,1204],{"class":1191},[1050,7142,1788],{"class":1195},[1050,7144,1192],{"class":1191},[1050,7146,1793],{"class":1135},[1050,7148,7149],{"class":1052,"line":4751},[1050,7150,1170],{"class":1169},[1050,7152,7153,7155,7157,7159,7161,7163,7165,7167,7169],{"class":1052,"line":4756},[1050,7154,1805],{"class":1804},[1050,7156,1808],{"class":1169},[1050,7158,1811],{"class":1804},[1050,7160,1814],{"class":1169},[1050,7162,1143],{"class":1135},[1050,7164,1820],{"class":1819},[1050,7166,1143],{"class":1135},[1050,7168,2351],{"class":1250},[1050,7170,2354],{"class":1135},[1050,7172,7173,7175,7177,7180,7182,7185,7187,7189],{"class":1052,"line":4766},[1050,7174,1844],{"class":1169},[1050,7176,1143],{"class":1135},[1050,7178,7179],{"class":1819},"advanced_field",[1050,7181,1852],{"class":1135},[1050,7183,7184],{"class":1250}," calculate_advanced_value",[1050,7186,1136],{"class":1135},[1050,7188,1268],{"class":1250},[1050,7190,1793],{"class":1135},[1050,7192,7193,7195,7197,7199],{"class":1052,"line":4787},[1050,7194,1844],{"class":1169},[1050,7196,1143],{"class":1135},[1050,7198,1875],{"class":1250},[1050,7200,1878],{"class":1135},[1050,7202,7203],{"class":1052,"line":4801},[1050,7204,1064],{"emptyLinePlaceholder":1063},[1050,7206,7207,7209,7211,7213,7215],{"class":1052,"line":4815},[1050,7208,1730],{"class":1127},[1050,7210,7184],{"class":1733},[1050,7212,1136],{"class":1135},[1050,7214,1268],{"class":1739},[1050,7216,1149],{"class":1135},[1050,7218,7219,7221,7224],{"class":1052,"line":4829},[1050,7220,1156],{"class":1155},[1050,7222,7223],{"class":1159},"Calculate advanced value for post",[1050,7225,1163],{"class":1155},[1050,7227,7228,7231,7233,7236,7238,7240,7242,7244,7246,7249,7251,7253,7255,7257,7259,7261,7263,7265],{"class":1052,"line":4843},[1050,7229,7230],{"class":1804},"    return",[1050,7232,2654],{"class":1127},[1050,7234,7235],{"class":1195},"\"advanced_",[1050,7237,2661],{"class":2660},[1050,7239,1268],{"class":1169},[1050,7241,1143],{"class":1135},[1050,7243,6404],{"class":1819},[1050,7245,2666],{"class":2660},[1050,7247,7248],{"class":1195},"_",[1050,7250,2661],{"class":2660},[1050,7252,6508],{"class":2436},[1050,7254,1136],{"class":1135},[1050,7256,1268],{"class":1250},[1050,7258,1143],{"class":1135},[1050,7260,1376],{"class":1819},[1050,7262,4391],{"class":1135},[1050,7264,2666],{"class":2660},[1050,7266,2829],{"class":1195},[1035,7268,7270],{"id":7269},"rollback-recovery-strategies","Rollback Recovery Strategies",[1040,7272,7274],{"className":1042,"code":7273,"language":1044,"meta":1045,"style":1045},"class RollbackRecoveryManager:\n    \"\"\"Manage recovery from failed rollbacks\"\"\"\n    \n    @staticmethod\n    def create_rollback_checkpoint():\n        \"\"\"Create checkpoint before rollback\"\"\"\n        \n        from django.core.management import call_command\n        from datetime import datetime\n        import json\n        \n        checkpoint_data = {\n            'timestamp': datetime.now().isoformat(),\n            'migration_state': {},\n            'data_snapshots': {}\n        }\n        \n        # Capture current migration state\n        from django.db.migrations.loader import MigrationLoader\n        loader = MigrationLoader(connection)\n        \n        for app_label in loader.migrated_apps:\n            app_migrations = []\n            \n            for migration_key in loader.graph.nodes:\n                if migration_key[0] == app_label:\n                    is_applied = migration_key in loader.applied_migrations\n                    if is_applied:\n                        app_migrations.append(migration_key[1])\n            \n            checkpoint_data['migration_state'][app_label] = app_migrations\n        \n        # Save checkpoint\n        checkpoint_file = f\"rollback_checkpoint_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json\"\n        \n        with open(checkpoint_file, 'w') as f:\n            json.dump(checkpoint_data, f, indent=2)\n        \n        return checkpoint_file\n    \n    @staticmethod\n    def recover_from_failed_rollback(checkpoint_file):\n        \"\"\"Recover from failed rollback using checkpoint\"\"\"\n        \n        import json\n        from django.core.management import call_command\n        \n        # Load checkpoint data\n        with open(checkpoint_file, 'r') as f:\n            checkpoint_data = json.load(f)\n        \n        recovery_plan = {\n            'steps': [],\n            'manual_actions': [],\n            'verification_steps': []\n        }\n        \n        # Analyze current state vs checkpoint\n        from django.db.migrations.loader import MigrationLoader\n        loader = MigrationLoader(connection)\n        \n        for app_label, expected_migrations in checkpoint_data['migration_state'].items():\n            current_migrations = []\n            \n            for migration_key in loader.applied_migrations:\n                if migration_key[0] == app_label:\n                    current_migrations.append(migration_key[1])\n            \n            # Find missing migrations\n            missing_migrations = set(expected_migrations) - set(current_migrations)\n            extra_migrations = set(current_migrations) - set(expected_migrations)\n            \n            if missing_migrations:\n                for migration in sorted(missing_migrations):\n                    recovery_plan['steps'].append(\n                        f\"python manage.py migrate {app_label} {migration}\"\n                    )\n            \n            if extra_migrations:\n                recovery_plan['manual_actions'].append(\n                    f\"Review extra migrations in {app_label}: {extra_migrations}\"\n                )\n        \n        # Add verification steps\n        recovery_plan['verification_steps'].extend([\n            \"python manage.py check\",\n            \"python manage.py showmigrations\",\n            \"Verify application functionality\",\n            \"Check data integrity\"\n        ])\n        \n        return recovery_plan\n    \n    @staticmethod\n    def create_emergency_rollback_script(app_label, target_migration):\n        \"\"\"Create emergency rollback script\"\"\"\n        \n        script_content = f'''#!/bin/bash\n# Emergency rollback script for {app_label} to {target_migration}\n# Generated on {datetime.now().isoformat()}\n\nset -e\n\necho \"Starting emergency rollback...\"\n\n# Create backup\necho \"Creating database backup...\"\npython manage.py dbbackup --compress\n\n# Check current migration state\necho \"Current migration state:\"\npython manage.py showmigrations {app_label}\n\n# Perform rollback\necho \"Rolling back to {target_migration}...\"\npython manage.py migrate {app_label} {target_migration}\n\n# Verify rollback\necho \"Verifying rollback...\"\npython manage.py check\npython manage.py showmigrations {app_label}\n\necho \"Emergency rollback completed!\"\necho \"Please verify application functionality manually.\"\n'''\n        \n        script_filename = f\"emergency_rollback_{app_label}_{target_migration}.sh\"\n        \n        with open(script_filename, 'w') as f:\n            f.write(script_content)\n        \n        # Make script executable\n        import os\n        os.chmod(script_filename, 0o755)\n        \n        return script_filename\n\n# Advanced rollback scenarios\nclass AdvancedRollbackScenarios:\n    \"\"\"Handle complex rollback scenarios\"\"\"\n    \n    @staticmethod\n    def rollback_with_data_migration():\n        \"\"\"Rollback that includes data migration\"\"\"\n        \n        def rollback_with_data_preservation(apps, schema_editor):\n            \"\"\"Preserve critical data during rollback\"\"\"\n            \n            Post = apps.get_model('blog', 'Post')\n            \n            # Export critical data before rollback\n            critical_data = []\n            \n            for post in Post.objects.all():\n                if hasattr(post, 'critical_field') and post.critical_field:\n                    critical_data.append({\n                        'post_id': post.id,\n                        'critical_value': post.critical_field\n                    })\n            \n            # Store in a safe location\n            if critical_data:\n                from django.core.cache import cache\n                cache.set('rollback_critical_data', critical_data, timeout=86400)\n                \n                print(f\"Preserved {len(critical_data)} critical data records\")\n        \n        return rollback_with_data_preservation\n    \n    @staticmethod\n    def partial_rollback_strategy():\n        \"\"\"Strategy for partial rollbacks\"\"\"\n        \n        def selective_rollback(apps, schema_editor):\n            \"\"\"Rollback only specific changes\"\"\"\n            \n            # This allows rolling back specific parts of a migration\n            # while preserving others\n            \n            Post = apps.get_model('blog', 'Post')\n            \n            # Rollback field changes but preserve data\n            posts_to_update = Post.objects.filter(\n                # Condition for selective rollback\n                status='migrated'\n            )\n            \n            for post in posts_to_update:\n                # Reverse specific changes\n                post.status = 'original'\n                # Keep other changes intact\n                post.save()\n        \n        return selective_rollback\n    \n    @staticmethod\n    def cross_app_rollback_coordination():\n        \"\"\"Coordinate rollbacks across multiple apps\"\"\"\n        \n        def coordinated_rollback(apps, schema_editor):\n            \"\"\"Rollback changes across multiple related apps\"\"\"\n            \n            # Get models from different apps\n            Post = apps.get_model('blog', 'Post')\n            Comment = apps.get_model('comments', 'Comment')\n            UserProfile = apps.get_model('accounts', 'UserProfile')\n            \n            # Coordinate rollback to maintain referential integrity\n            \n            # Step 1: Handle dependent data\n            Comment.objects.filter(\n                post__in=Post.objects.filter(status='to_rollback')\n            ).update(status='archived')\n            \n            # Step 2: Rollback main changes\n            Post.objects.filter(status='to_rollback').update(\n                status='published'\n            )\n            \n            # Step 3: Update related models\n            UserProfile.objects.filter(\n                user__post__status='published'\n            ).update(post_count=F('post_count') + 1)\n        \n        return coordinated_rollback\n",[1047,7275,7276,7285,7294,7298,7304,7313,7322,7326,7346,7358,7366,7370,7379,7406,7420,7434,7438,7442,7447,7469,7484,7488,7507,7516,7520,7542,7562,7580,7590,7611,7615,7640,7644,7649,7697,7701,7731,7762,7766,7773,7777,7783,7796,7805,7809,7815,7833,7837,7842,7869,7890,7894,7903,7915,7928,7941,7945,7949,7954,7976,7990,7994,8025,8034,8038,8055,8073,8092,8096,8101,8129,8154,8158,8167,8187,8206,8228,8233,8237,8246,8265,8290,8294,8298,8303,8322,8334,8345,8356,8365,8370,8374,8381,8385,8391,8408,8417,8421,8433,8454,8475,8479,8484,8488,8493,8497,8502,8507,8512,8516,8521,8526,8537,8541,8546,8560,8577,8581,8586,8591,8596,8606,8610,8615,8620,8625,8629,8658,8662,8689,8706,8710,8715,8722,8746,8750,8757,8761,8766,8775,8784,8788,8794,8803,8812,8816,8833,8842,8846,8876,8880,8885,8894,8898,8918,8951,8962,8982,9000,9005,9009,9014,9023,9041,9073,9077,9106,9110,9117,9121,9127,9136,9145,9149,9166,9175,9179,9184,9189,9193,9223,9227,9232,9251,9256,9270,9274,9278,9291,9296,9314,9319,9329,9333,9340,9344,9350,9359,9368,9372,9389,9398,9402,9407,9437,9470,9503,9507,9512,9516,9521,9536,9568,9589,9593,9598,9628,9641,9646,9651,9657,9673,9687,9721,9726],{"__ignoreMap":1045},[1050,7277,7278,7280,7283],{"class":1052,"line":1053},[1050,7279,1128],{"class":1127},[1050,7281,7282],{"class":1131}," RollbackRecoveryManager",[1050,7284,2415],{"class":1135},[1050,7286,7287,7289,7292],{"class":1052,"line":1060},[1050,7288,1156],{"class":1155},[1050,7290,7291],{"class":1159},"Manage recovery from failed rollbacks",[1050,7293,1163],{"class":1155},[1050,7295,7296],{"class":1052,"line":1067},[1050,7297,1170],{"class":1169},[1050,7299,7300,7302],{"class":1052,"line":1073},[1050,7301,5377],{"class":1135},[1050,7303,5380],{"class":2775},[1050,7305,7306,7308,7311],{"class":1052,"line":1079},[1050,7307,2433],{"class":1127},[1050,7309,7310],{"class":1733}," create_rollback_checkpoint",[1050,7312,2354],{"class":1135},[1050,7314,7315,7317,7320],{"class":1052,"line":1084},[1050,7316,2528],{"class":1155},[1050,7318,7319],{"class":1159},"Create checkpoint before rollback",[1050,7321,1163],{"class":1155},[1050,7323,7324],{"class":1052,"line":1090},[1050,7325,1331],{"class":1169},[1050,7327,7328,7330,7332,7334,7336,7338,7341,7343],{"class":1052,"line":1096},[1050,7329,2450],{"class":1804},[1050,7331,2453],{"class":1169},[1050,7333,1143],{"class":1135},[1050,7335,6440],{"class":1169},[1050,7337,1143],{"class":1135},[1050,7339,7340],{"class":1169},"management ",[1050,7342,2470],{"class":1804},[1050,7344,7345],{"class":1169}," call_command\n",[1050,7347,7348,7350,7353,7355],{"class":1052,"line":1101},[1050,7349,2450],{"class":1804},[1050,7351,7352],{"class":1169}," datetime ",[1050,7354,2470],{"class":1804},[1050,7356,7357],{"class":1169}," datetime\n",[1050,7359,7360,7363],{"class":1052,"line":1107},[1050,7361,7362],{"class":1804},"        import",[1050,7364,7365],{"class":1169}," json\n",[1050,7367,7368],{"class":1052,"line":1113},[1050,7369,1331],{"class":1169},[1050,7371,7372,7375,7377],{"class":1052,"line":1118},[1050,7373,7374],{"class":1169},"        checkpoint_data ",[1050,7376,1179],{"class":1135},[1050,7378,2622],{"class":1135},[1050,7380,7381,7383,7386,7388,7390,7393,7395,7398,7401,7404],{"class":1052,"line":1124},[1050,7382,2851],{"class":1191},[1050,7384,7385],{"class":1195},"timestamp",[1050,7387,1192],{"class":1191},[1050,7389,2635],{"class":1135},[1050,7391,7392],{"class":1169}," datetime",[1050,7394,1143],{"class":1135},[1050,7396,7397],{"class":1250},"now",[1050,7399,7400],{"class":1135},"().",[1050,7402,7403],{"class":1250},"isoformat",[1050,7405,2921],{"class":1135},[1050,7407,7408,7410,7413,7415,7417],{"class":1052,"line":1152},[1050,7409,2851],{"class":1191},[1050,7411,7412],{"class":1195},"migration_state",[1050,7414,1192],{"class":1191},[1050,7416,2635],{"class":1135},[1050,7418,7419],{"class":1135}," {},\n",[1050,7421,7422,7424,7427,7429,7431],{"class":1052,"line":1166},[1050,7423,2851],{"class":1191},[1050,7425,7426],{"class":1195},"data_snapshots",[1050,7428,1192],{"class":1191},[1050,7430,2635],{"class":1135},[1050,7432,7433],{"class":1135}," {}\n",[1050,7435,7436],{"class":1052,"line":1173},[1050,7437,2940],{"class":1135},[1050,7439,7440],{"class":1052,"line":1185},[1050,7441,1331],{"class":1169},[1050,7443,7444],{"class":1052,"line":1215},[1050,7445,7446],{"class":1056},"        # Capture current migration state\n",[1050,7448,7449,7451,7453,7455,7457,7459,7461,7463,7465,7467],{"class":1052,"line":1221},[1050,7450,2450],{"class":1804},[1050,7452,2453],{"class":1169},[1050,7454,1143],{"class":1135},[1050,7456,2458],{"class":1169},[1050,7458,1143],{"class":1135},[1050,7460,1140],{"class":1169},[1050,7462,1143],{"class":1135},[1050,7464,2467],{"class":1169},[1050,7466,2470],{"class":1804},[1050,7468,2473],{"class":1169},[1050,7470,7471,7474,7476,7478,7480,7482],{"class":1052,"line":1226},[1050,7472,7473],{"class":1169},"        loader ",[1050,7475,1179],{"class":1135},[1050,7477,2489],{"class":1250},[1050,7479,1136],{"class":1135},[1050,7481,2494],{"class":1250},[1050,7483,1793],{"class":1135},[1050,7485,7486],{"class":1052,"line":1236},[1050,7487,1331],{"class":1169},[1050,7489,7490,7492,7495,7497,7500,7502,7505],{"class":1052,"line":1242},[1050,7491,2954],{"class":1804},[1050,7493,7494],{"class":1169}," app_label ",[1050,7496,1811],{"class":1804},[1050,7498,7499],{"class":1169}," loader",[1050,7501,1143],{"class":1135},[1050,7503,7504],{"class":1819},"migrated_apps",[1050,7506,2415],{"class":1135},[1050,7508,7509,7512,7514],{"class":1052,"line":1257},[1050,7510,7511],{"class":1169},"            app_migrations ",[1050,7513,1179],{"class":1135},[1050,7515,2935],{"class":1135},[1050,7517,7518],{"class":1052,"line":1276},[1050,7519,2995],{"class":1169},[1050,7521,7522,7525,7528,7530,7532,7534,7536,7538,7540],{"class":1052,"line":1293},[1050,7523,7524],{"class":1804},"            for",[1050,7526,7527],{"class":1169}," migration_key ",[1050,7529,1811],{"class":1804},[1050,7531,7499],{"class":1169},[1050,7533,1143],{"class":1135},[1050,7535,2607],{"class":1819},[1050,7537,1143],{"class":1135},[1050,7539,2612],{"class":1819},[1050,7541,2415],{"class":1135},[1050,7543,7544,7547,7550,7552,7554,7556,7558,7560],{"class":1052,"line":1322},[1050,7545,7546],{"class":1804},"                if",[1050,7548,7549],{"class":1169}," migration_key",[1050,7551,3028],{"class":1135},[1050,7553,1317],{"class":1316},[1050,7555,3149],{"class":1135},[1050,7557,4565],{"class":2592},[1050,7559,2516],{"class":1169},[1050,7561,2415],{"class":1135},[1050,7563,7564,7567,7569,7571,7573,7575,7577],{"class":1052,"line":1328},[1050,7565,7566],{"class":1169},"                    is_applied ",[1050,7568,1179],{"class":1135},[1050,7570,7527],{"class":1169},[1050,7572,1811],{"class":2592},[1050,7574,7499],{"class":1169},[1050,7576,1143],{"class":1135},[1050,7578,7579],{"class":1819},"applied_migrations\n",[1050,7581,7582,7585,7588],{"class":1052,"line":1334},[1050,7583,7584],{"class":1804},"                    if",[1050,7586,7587],{"class":1169}," is_applied",[1050,7589,2415],{"class":1135},[1050,7591,7592,7595,7597,7599,7601,7604,7606,7609],{"class":1052,"line":1340},[1050,7593,7594],{"class":1169},"                        app_migrations",[1050,7596,1143],{"class":1135},[1050,7598,3040],{"class":1250},[1050,7600,1136],{"class":1135},[1050,7602,7603],{"class":1250},"migration_key",[1050,7605,3028],{"class":1135},[1050,7607,7608],{"class":1316},"1",[1050,7610,2767],{"class":1135},[1050,7612,7613],{"class":1052,"line":1352},[1050,7614,2995],{"class":1169},[1050,7616,7617,7620,7622,7624,7626,7628,7631,7633,7635,7637],{"class":1052,"line":1367},[1050,7618,7619],{"class":1169},"            checkpoint_data",[1050,7621,3028],{"class":1135},[1050,7623,1192],{"class":1191},[1050,7625,7412],{"class":1195},[1050,7627,1192],{"class":1191},[1050,7629,7630],{"class":1135},"][",[1050,7632,2571],{"class":1169},[1050,7634,3149],{"class":1135},[1050,7636,1852],{"class":1135},[1050,7638,7639],{"class":1169}," app_migrations\n",[1050,7641,7642],{"class":1052,"line":1383},[1050,7643,1331],{"class":1169},[1050,7645,7646],{"class":1052,"line":1413},[1050,7647,7648],{"class":1056},"        # Save checkpoint\n",[1050,7650,7651,7654,7656,7658,7661,7663,7666,7668,7670,7672,7675,7677,7679,7682,7685,7688,7690,7692,7694],{"class":1052,"line":1418},[1050,7652,7653],{"class":1169},"        checkpoint_file ",[1050,7655,1179],{"class":1135},[1050,7657,2654],{"class":1127},[1050,7659,7660],{"class":1195},"\"rollback_checkpoint_",[1050,7662,2661],{"class":2660},[1050,7664,7665],{"class":1169},"datetime",[1050,7667,1143],{"class":1135},[1050,7669,7397],{"class":1250},[1050,7671,7400],{"class":1135},[1050,7673,7674],{"class":1250},"strftime",[1050,7676,1136],{"class":1135},[1050,7678,1192],{"class":1191},[1050,7680,7681],{"class":1195},"%Y%m",[1050,7683,7684],{"class":2660},"%d",[1050,7686,7687],{"class":1195},"_%H%M%S",[1050,7689,1192],{"class":1191},[1050,7691,4391],{"class":1135},[1050,7693,2666],{"class":2660},[1050,7695,7696],{"class":1195},".json\"\n",[1050,7698,7699],{"class":1052,"line":1423},[1050,7700,1331],{"class":1169},[1050,7702,7703,7706,7709,7711,7714,7716,7718,7721,7723,7725,7727,7729],{"class":1052,"line":1429},[1050,7704,7705],{"class":1804},"        with",[1050,7707,7708],{"class":2436}," open",[1050,7710,1136],{"class":1135},[1050,7712,7713],{"class":1250},"checkpoint_file",[1050,7715,1201],{"class":1135},[1050,7717,1204],{"class":1191},[1050,7719,7720],{"class":1195},"w",[1050,7722,1192],{"class":1191},[1050,7724,4391],{"class":1135},[1050,7726,2779],{"class":1804},[1050,7728,2654],{"class":1169},[1050,7730,2415],{"class":1135},[1050,7732,7733,7736,7738,7741,7743,7746,7748,7750,7752,7755,7757,7760],{"class":1052,"line":1441},[1050,7734,7735],{"class":1169},"            json",[1050,7737,1143],{"class":1135},[1050,7739,7740],{"class":1250},"dump",[1050,7742,1136],{"class":1135},[1050,7744,7745],{"class":1250},"checkpoint_data",[1050,7747,1201],{"class":1135},[1050,7749,2654],{"class":1250},[1050,7751,1201],{"class":1135},[1050,7753,7754],{"class":1260}," indent",[1050,7756,1179],{"class":1135},[1050,7758,7759],{"class":1316},"2",[1050,7761,1793],{"class":1135},[1050,7763,7764],{"class":1052,"line":1456},[1050,7765,1331],{"class":1169},[1050,7767,7768,7770],{"class":1052,"line":1502},[1050,7769,3307],{"class":1804},[1050,7771,7772],{"class":1169}," checkpoint_file\n",[1050,7774,7775],{"class":1052,"line":1507},[1050,7776,1170],{"class":1169},[1050,7778,7779,7781],{"class":1052,"line":1512},[1050,7780,5377],{"class":1135},[1050,7782,5380],{"class":2775},[1050,7784,7785,7787,7790,7792,7794],{"class":1052,"line":1517},[1050,7786,2433],{"class":1127},[1050,7788,7789],{"class":1733}," recover_from_failed_rollback",[1050,7791,1136],{"class":1135},[1050,7793,7713],{"class":1739},[1050,7795,1149],{"class":1135},[1050,7797,7798,7800,7803],{"class":1052,"line":1523},[1050,7799,2528],{"class":1155},[1050,7801,7802],{"class":1159},"Recover from failed rollback using checkpoint",[1050,7804,1163],{"class":1155},[1050,7806,7807],{"class":1052,"line":1540},[1050,7808,1331],{"class":1169},[1050,7810,7811,7813],{"class":1052,"line":1550},[1050,7812,7362],{"class":1804},[1050,7814,7365],{"class":1169},[1050,7816,7817,7819,7821,7823,7825,7827,7829,7831],{"class":1052,"line":1555},[1050,7818,2450],{"class":1804},[1050,7820,2453],{"class":1169},[1050,7822,1143],{"class":1135},[1050,7824,6440],{"class":1169},[1050,7826,1143],{"class":1135},[1050,7828,7340],{"class":1169},[1050,7830,2470],{"class":1804},[1050,7832,7345],{"class":1169},[1050,7834,7835],{"class":1052,"line":1564},[1050,7836,1331],{"class":1169},[1050,7838,7839],{"class":1052,"line":1586},[1050,7840,7841],{"class":1056},"        # Load checkpoint data\n",[1050,7843,7844,7846,7848,7850,7852,7854,7856,7859,7861,7863,7865,7867],{"class":1052,"line":1591},[1050,7845,7705],{"class":1804},[1050,7847,7708],{"class":2436},[1050,7849,1136],{"class":1135},[1050,7851,7713],{"class":1250},[1050,7853,1201],{"class":1135},[1050,7855,1204],{"class":1191},[1050,7857,7858],{"class":1195},"r",[1050,7860,1192],{"class":1191},[1050,7862,4391],{"class":1135},[1050,7864,2779],{"class":1804},[1050,7866,2654],{"class":1169},[1050,7868,2415],{"class":1135},[1050,7870,7871,7874,7876,7879,7881,7884,7886,7888],{"class":1052,"line":1596},[1050,7872,7873],{"class":1169},"            checkpoint_data ",[1050,7875,1179],{"class":1135},[1050,7877,7878],{"class":1169}," json",[1050,7880,1143],{"class":1135},[1050,7882,7883],{"class":1250},"load",[1050,7885,1136],{"class":1135},[1050,7887,6500],{"class":1250},[1050,7889,1793],{"class":1135},[1050,7891,7892],{"class":1052,"line":1605},[1050,7893,1331],{"class":1169},[1050,7895,7896,7899,7901],{"class":1052,"line":1611},[1050,7897,7898],{"class":1169},"        recovery_plan ",[1050,7900,1179],{"class":1135},[1050,7902,2622],{"class":1135},[1050,7904,7905,7907,7909,7911,7913],{"class":1052,"line":1623},[1050,7906,2851],{"class":1191},[1050,7908,4792],{"class":1195},[1050,7910,1192],{"class":1191},[1050,7912,2635],{"class":1135},[1050,7914,2876],{"class":1135},[1050,7916,7917,7919,7922,7924,7926],{"class":1052,"line":1641},[1050,7918,2851],{"class":1191},[1050,7920,7921],{"class":1195},"manual_actions",[1050,7923,1192],{"class":1191},[1050,7925,2635],{"class":1135},[1050,7927,2876],{"class":1135},[1050,7929,7930,7932,7935,7937,7939],{"class":1052,"line":1658},[1050,7931,2851],{"class":1191},[1050,7933,7934],{"class":1195},"verification_steps",[1050,7936,1192],{"class":1191},[1050,7938,2635],{"class":1135},[1050,7940,2935],{"class":1135},[1050,7942,7943],{"class":1052,"line":1663},[1050,7944,2940],{"class":1135},[1050,7946,7947],{"class":1052,"line":1668},[1050,7948,1331],{"class":1169},[1050,7950,7951],{"class":1052,"line":1674},[1050,7952,7953],{"class":1056},"        # Analyze current state vs checkpoint\n",[1050,7955,7956,7958,7960,7962,7964,7966,7968,7970,7972,7974],{"class":1052,"line":1686},[1050,7957,2450],{"class":1804},[1050,7959,2453],{"class":1169},[1050,7961,1143],{"class":1135},[1050,7963,2458],{"class":1169},[1050,7965,1143],{"class":1135},[1050,7967,1140],{"class":1169},[1050,7969,1143],{"class":1135},[1050,7971,2467],{"class":1169},[1050,7973,2470],{"class":1804},[1050,7975,2473],{"class":1169},[1050,7977,7978,7980,7982,7984,7986,7988],{"class":1052,"line":1699},[1050,7979,7473],{"class":1169},[1050,7981,1179],{"class":1135},[1050,7983,2489],{"class":1250},[1050,7985,1136],{"class":1135},[1050,7987,2494],{"class":1250},[1050,7989,1793],{"class":1135},[1050,7991,7992],{"class":1052,"line":1712},[1050,7993,1331],{"class":1169},[1050,7995,7996,7998,8000,8002,8005,8007,8010,8012,8014,8016,8018,8020,8023],{"class":1052,"line":1717},[1050,7997,2954],{"class":1804},[1050,7999,2516],{"class":1169},[1050,8001,1201],{"class":1135},[1050,8003,8004],{"class":1169}," expected_migrations ",[1050,8006,1811],{"class":1804},[1050,8008,8009],{"class":1169}," checkpoint_data",[1050,8011,3028],{"class":1135},[1050,8013,1192],{"class":1191},[1050,8015,7412],{"class":1195},[1050,8017,1192],{"class":1191},[1050,8019,3037],{"class":1135},[1050,8021,8022],{"class":1250},"items",[1050,8024,2354],{"class":1135},[1050,8026,8027,8030,8032],{"class":1052,"line":1722},[1050,8028,8029],{"class":1169},"            current_migrations ",[1050,8031,1179],{"class":1135},[1050,8033,2935],{"class":1135},[1050,8035,8036],{"class":1052,"line":1727},[1050,8037,2995],{"class":1169},[1050,8039,8040,8042,8044,8046,8048,8050,8053],{"class":1052,"line":1750},[1050,8041,7524],{"class":1804},[1050,8043,7527],{"class":1169},[1050,8045,1811],{"class":1804},[1050,8047,7499],{"class":1169},[1050,8049,1143],{"class":1135},[1050,8051,8052],{"class":1819},"applied_migrations",[1050,8054,2415],{"class":1135},[1050,8056,8057,8059,8061,8063,8065,8067,8069,8071],{"class":1052,"line":1760},[1050,8058,7546],{"class":1804},[1050,8060,7549],{"class":1169},[1050,8062,3028],{"class":1135},[1050,8064,1317],{"class":1316},[1050,8066,3149],{"class":1135},[1050,8068,4565],{"class":2592},[1050,8070,2516],{"class":1169},[1050,8072,2415],{"class":1135},[1050,8074,8075,8078,8080,8082,8084,8086,8088,8090],{"class":1052,"line":1796},[1050,8076,8077],{"class":1169},"                    current_migrations",[1050,8079,1143],{"class":1135},[1050,8081,3040],{"class":1250},[1050,8083,1136],{"class":1135},[1050,8085,7603],{"class":1250},[1050,8087,3028],{"class":1135},[1050,8089,7608],{"class":1316},[1050,8091,2767],{"class":1135},[1050,8093,8094],{"class":1052,"line":1801},[1050,8095,2995],{"class":1169},[1050,8097,8098],{"class":1052,"line":1841},[1050,8099,8100],{"class":1056},"            # Find missing migrations\n",[1050,8102,8103,8106,8108,8110,8112,8115,8117,8120,8122,8124,8127],{"class":1052,"line":1868},[1050,8104,8105],{"class":1169},"            missing_migrations ",[1050,8107,1179],{"class":1135},[1050,8109,2918],{"class":2775},[1050,8111,1136],{"class":1135},[1050,8113,8114],{"class":1250},"expected_migrations",[1050,8116,4391],{"class":1135},[1050,8118,8119],{"class":2592}," -",[1050,8121,2918],{"class":2775},[1050,8123,1136],{"class":1135},[1050,8125,8126],{"class":1250},"current_migrations",[1050,8128,1793],{"class":1135},[1050,8130,8131,8134,8136,8138,8140,8142,8144,8146,8148,8150,8152],{"class":1052,"line":1881},[1050,8132,8133],{"class":1169},"            extra_migrations ",[1050,8135,1179],{"class":1135},[1050,8137,2918],{"class":2775},[1050,8139,1136],{"class":1135},[1050,8141,8126],{"class":1250},[1050,8143,4391],{"class":1135},[1050,8145,8119],{"class":2592},[1050,8147,2918],{"class":2775},[1050,8149,1136],{"class":1135},[1050,8151,8114],{"class":1250},[1050,8153,1793],{"class":1135},[1050,8155,8156],{"class":1052,"line":1886},[1050,8157,2995],{"class":1169},[1050,8159,8160,8162,8165],{"class":1052,"line":1904},[1050,8161,2974],{"class":1804},[1050,8163,8164],{"class":1169}," missing_migrations",[1050,8166,2415],{"class":1135},[1050,8168,8169,8172,8175,8177,8180,8182,8185],{"class":1052,"line":1914},[1050,8170,8171],{"class":1804},"                for",[1050,8173,8174],{"class":1169}," migration ",[1050,8176,1811],{"class":1804},[1050,8178,8179],{"class":2436}," sorted",[1050,8181,1136],{"class":1135},[1050,8183,8184],{"class":1250},"missing_migrations",[1050,8186,1149],{"class":1135},[1050,8188,8189,8192,8194,8196,8198,8200,8202,8204],{"class":1052,"line":1945},[1050,8190,8191],{"class":1169},"                    recovery_plan",[1050,8193,3028],{"class":1135},[1050,8195,1192],{"class":1191},[1050,8197,4792],{"class":1195},[1050,8199,1192],{"class":1191},[1050,8201,3037],{"class":1135},[1050,8203,3040],{"class":1250},[1050,8205,1254],{"class":1135},[1050,8207,8208,8211,8214,8216,8218,8220,8222,8224,8226],{"class":1052,"line":1950},[1050,8209,8210],{"class":1127},"                        f",[1050,8212,8213],{"class":1195},"\"python manage.py migrate ",[1050,8215,2661],{"class":2660},[1050,8217,2571],{"class":1250},[1050,8219,2666],{"class":2660},[1050,8221,5162],{"class":2660},[1050,8223,3014],{"class":1250},[1050,8225,2666],{"class":2660},[1050,8227,2829],{"class":1195},[1050,8229,8230],{"class":1052,"line":1956},[1050,8231,8232],{"class":1135},"                    )\n",[1050,8234,8235],{"class":1052,"line":1996},[1050,8236,2995],{"class":1169},[1050,8238,8239,8241,8244],{"class":1052,"line":2001},[1050,8240,2974],{"class":1804},[1050,8242,8243],{"class":1169}," extra_migrations",[1050,8245,2415],{"class":1135},[1050,8247,8248,8251,8253,8255,8257,8259,8261,8263],{"class":1052,"line":2007},[1050,8249,8250],{"class":1169},"                recovery_plan",[1050,8252,3028],{"class":1135},[1050,8254,1192],{"class":1191},[1050,8256,7921],{"class":1195},[1050,8258,1192],{"class":1191},[1050,8260,3037],{"class":1135},[1050,8262,3040],{"class":1250},[1050,8264,1254],{"class":1135},[1050,8266,8267,8269,8272,8274,8276,8278,8281,8283,8286,8288],{"class":1052,"line":2024},[1050,8268,4448],{"class":1127},[1050,8270,8271],{"class":1195},"\"Review extra migrations in ",[1050,8273,2661],{"class":2660},[1050,8275,2571],{"class":1250},[1050,8277,2666],{"class":2660},[1050,8279,8280],{"class":1195},": ",[1050,8282,2661],{"class":2660},[1050,8284,8285],{"class":1250},"extra_migrations",[1050,8287,2666],{"class":2660},[1050,8289,2829],{"class":1195},[1050,8291,8292],{"class":1052,"line":2034},[1050,8293,3194],{"class":1135},[1050,8295,8296],{"class":1052,"line":2039},[1050,8297,1331],{"class":1169},[1050,8299,8300],{"class":1052,"line":2048},[1050,8301,8302],{"class":1056},"        # Add verification steps\n",[1050,8304,8305,8308,8310,8312,8314,8316,8318,8320],{"class":1052,"line":2070},[1050,8306,8307],{"class":1169},"        recovery_plan",[1050,8309,3028],{"class":1135},[1050,8311,1192],{"class":1191},[1050,8313,7934],{"class":1195},[1050,8315,1192],{"class":1191},[1050,8317,3037],{"class":1135},[1050,8319,3171],{"class":1250},[1050,8321,4916],{"class":1135},[1050,8323,8324,8327,8330,8332],{"class":1052,"line":2075},[1050,8325,8326],{"class":1191},"            \"",[1050,8328,8329],{"class":1195},"python manage.py check",[1050,8331,1631],{"class":1191},[1050,8333,1273],{"class":1135},[1050,8335,8336,8338,8341,8343],{"class":1052,"line":2080},[1050,8337,8326],{"class":1191},[1050,8339,8340],{"class":1195},"python manage.py showmigrations",[1050,8342,1631],{"class":1191},[1050,8344,1273],{"class":1135},[1050,8346,8347,8349,8352,8354],{"class":1052,"line":2089},[1050,8348,8326],{"class":1191},[1050,8350,8351],{"class":1195},"Verify application functionality",[1050,8353,1631],{"class":1191},[1050,8355,1273],{"class":1135},[1050,8357,8358,8360,8363],{"class":1052,"line":2095},[1050,8359,8326],{"class":1191},[1050,8361,8362],{"class":1195},"Check data integrity",[1050,8364,2829],{"class":1191},[1050,8366,8367],{"class":1052,"line":2107},[1050,8368,8369],{"class":1135},"        ])\n",[1050,8371,8372],{"class":1052,"line":2122},[1050,8373,1331],{"class":1169},[1050,8375,8376,8378],{"class":1052,"line":2138},[1050,8377,3307],{"class":1804},[1050,8379,8380],{"class":1169}," recovery_plan\n",[1050,8382,8383],{"class":1052,"line":2143},[1050,8384,1170],{"class":1169},[1050,8386,8387,8389],{"class":1052,"line":2148},[1050,8388,5377],{"class":1135},[1050,8390,5380],{"class":2775},[1050,8392,8393,8395,8398,8400,8402,8404,8406],{"class":1052,"line":2154},[1050,8394,2433],{"class":1127},[1050,8396,8397],{"class":1733}," create_emergency_rollback_script",[1050,8399,1136],{"class":1135},[1050,8401,2571],{"class":1739},[1050,8403,1201],{"class":1135},[1050,8405,2521],{"class":1739},[1050,8407,1149],{"class":1135},[1050,8409,8410,8412,8415],{"class":1052,"line":2165},[1050,8411,2528],{"class":1155},[1050,8413,8414],{"class":1159},"Create emergency rollback script",[1050,8416,1163],{"class":1155},[1050,8418,8419],{"class":1052,"line":2177},[1050,8420,1331],{"class":1169},[1050,8422,8423,8426,8428,8430],{"class":1052,"line":2200},[1050,8424,8425],{"class":1169},"        script_content ",[1050,8427,1179],{"class":1135},[1050,8429,2654],{"class":1127},[1050,8431,8432],{"class":1195},"'''#!/bin/bash\n",[1050,8434,8435,8438,8440,8442,8444,8447,8449,8451],{"class":1052,"line":2205},[1050,8436,8437],{"class":1195},"# Emergency rollback script for ",[1050,8439,2661],{"class":2660},[1050,8441,2571],{"class":1169},[1050,8443,2666],{"class":2660},[1050,8445,8446],{"class":1195}," to ",[1050,8448,2661],{"class":2660},[1050,8450,2673],{"class":1169},[1050,8452,8453],{"class":2660},"}\n",[1050,8455,8456,8459,8461,8463,8465,8467,8469,8471,8473],{"class":1052,"line":2210},[1050,8457,8458],{"class":1195},"# Generated on ",[1050,8460,2661],{"class":2660},[1050,8462,7665],{"class":1169},[1050,8464,1143],{"class":1135},[1050,8466,7397],{"class":1250},[1050,8468,7400],{"class":1135},[1050,8470,7403],{"class":1250},[1050,8472,6847],{"class":1135},[1050,8474,8453],{"class":2660},[1050,8476,8477],{"class":1052,"line":2216},[1050,8478,1064],{"emptyLinePlaceholder":1063},[1050,8480,8481],{"class":1052,"line":2227},[1050,8482,8483],{"class":1195},"set -e\n",[1050,8485,8486],{"class":1052,"line":2243},[1050,8487,1064],{"emptyLinePlaceholder":1063},[1050,8489,8490],{"class":1052,"line":2249},[1050,8491,8492],{"class":1195},"echo \"Starting emergency rollback...\"\n",[1050,8494,8495],{"class":1052,"line":2254},[1050,8496,1064],{"emptyLinePlaceholder":1063},[1050,8498,8499],{"class":1052,"line":2259},[1050,8500,8501],{"class":1195},"# Create backup\n",[1050,8503,8504],{"class":1052,"line":2264},[1050,8505,8506],{"class":1195},"echo \"Creating database backup...\"\n",[1050,8508,8509],{"class":1052,"line":2282},[1050,8510,8511],{"class":1195},"python manage.py dbbackup --compress\n",[1050,8513,8514],{"class":1052,"line":2292},[1050,8515,1064],{"emptyLinePlaceholder":1063},[1050,8517,8518],{"class":1052,"line":2323},[1050,8519,8520],{"class":1195},"# Check current migration state\n",[1050,8522,8523],{"class":1052,"line":2328},[1050,8524,8525],{"class":1195},"echo \"Current migration state:\"\n",[1050,8527,8528,8531,8533,8535],{"class":1052,"line":2334},[1050,8529,8530],{"class":1195},"python manage.py showmigrations ",[1050,8532,2661],{"class":2660},[1050,8534,2571],{"class":1169},[1050,8536,8453],{"class":2660},[1050,8538,8539],{"class":1052,"line":2357},[1050,8540,1064],{"emptyLinePlaceholder":1063},[1050,8542,8543],{"class":1052,"line":2363},[1050,8544,8545],{"class":1195},"# Perform rollback\n",[1050,8547,8548,8551,8553,8555,8557],{"class":1052,"line":2388},[1050,8549,8550],{"class":1195},"echo \"Rolling back to ",[1050,8552,2661],{"class":2660},[1050,8554,2673],{"class":1169},[1050,8556,2666],{"class":2660},[1050,8558,8559],{"class":1195},"...\"\n",[1050,8561,8562,8565,8567,8569,8571,8573,8575],{"class":1052,"line":3933},[1050,8563,8564],{"class":1195},"python manage.py migrate ",[1050,8566,2661],{"class":2660},[1050,8568,2571],{"class":1169},[1050,8570,2666],{"class":2660},[1050,8572,5162],{"class":2660},[1050,8574,2673],{"class":1169},[1050,8576,8453],{"class":2660},[1050,8578,8579],{"class":1052,"line":3955},[1050,8580,1064],{"emptyLinePlaceholder":1063},[1050,8582,8583],{"class":1052,"line":3974},[1050,8584,8585],{"class":1195},"# Verify rollback\n",[1050,8587,8588],{"class":1052,"line":3995},[1050,8589,8590],{"class":1195},"echo \"Verifying rollback...\"\n",[1050,8592,8593],{"class":1052,"line":4000},[1050,8594,8595],{"class":1195},"python manage.py check\n",[1050,8597,8598,8600,8602,8604],{"class":1052,"line":4005},[1050,8599,8530],{"class":1195},[1050,8601,2661],{"class":2660},[1050,8603,2571],{"class":1169},[1050,8605,8453],{"class":2660},[1050,8607,8608],{"class":1052,"line":4022},[1050,8609,1064],{"emptyLinePlaceholder":1063},[1050,8611,8612],{"class":1052,"line":4041},[1050,8613,8614],{"class":1195},"echo \"Emergency rollback completed!\"\n",[1050,8616,8617],{"class":1052,"line":4060},[1050,8618,8619],{"class":1195},"echo \"Please verify application functionality manually.\"\n",[1050,8621,8622],{"class":1052,"line":4081},[1050,8623,8624],{"class":1195},"'''\n",[1050,8626,8627],{"class":1052,"line":4086},[1050,8628,1331],{"class":1169},[1050,8630,8631,8634,8636,8638,8641,8643,8645,8647,8649,8651,8653,8655],{"class":1052,"line":4109},[1050,8632,8633],{"class":1169},"        script_filename ",[1050,8635,1179],{"class":1135},[1050,8637,2654],{"class":1127},[1050,8639,8640],{"class":1195},"\"emergency_rollback_",[1050,8642,2661],{"class":2660},[1050,8644,2571],{"class":1169},[1050,8646,2666],{"class":2660},[1050,8648,7248],{"class":1195},[1050,8650,2661],{"class":2660},[1050,8652,2673],{"class":1169},[1050,8654,2666],{"class":2660},[1050,8656,8657],{"class":1195},".sh\"\n",[1050,8659,8660],{"class":1052,"line":4140},[1050,8661,1331],{"class":1169},[1050,8663,8664,8666,8668,8670,8673,8675,8677,8679,8681,8683,8685,8687],{"class":1052,"line":4145},[1050,8665,7705],{"class":1804},[1050,8667,7708],{"class":2436},[1050,8669,1136],{"class":1135},[1050,8671,8672],{"class":1250},"script_filename",[1050,8674,1201],{"class":1135},[1050,8676,1204],{"class":1191},[1050,8678,7720],{"class":1195},[1050,8680,1192],{"class":1191},[1050,8682,4391],{"class":1135},[1050,8684,2779],{"class":1804},[1050,8686,2654],{"class":1169},[1050,8688,2415],{"class":1135},[1050,8690,8691,8694,8696,8699,8701,8704],{"class":1052,"line":4162},[1050,8692,8693],{"class":1169},"            f",[1050,8695,1143],{"class":1135},[1050,8697,8698],{"class":1250},"write",[1050,8700,1136],{"class":1135},[1050,8702,8703],{"class":1250},"script_content",[1050,8705,1793],{"class":1135},[1050,8707,8708],{"class":1052,"line":4184},[1050,8709,1331],{"class":1169},[1050,8711,8712],{"class":1052,"line":4203},[1050,8713,8714],{"class":1056},"        # Make script executable\n",[1050,8716,8717,8719],{"class":1052,"line":4224},[1050,8718,7362],{"class":1804},[1050,8720,8721],{"class":1169}," os\n",[1050,8723,8724,8727,8729,8732,8734,8736,8738,8741,8744],{"class":1052,"line":4229},[1050,8725,8726],{"class":1169},"        os",[1050,8728,1143],{"class":1135},[1050,8730,8731],{"class":1250},"chmod",[1050,8733,1136],{"class":1135},[1050,8735,8672],{"class":1250},[1050,8737,1201],{"class":1135},[1050,8739,8740],{"class":1127}," 0o",[1050,8742,8743],{"class":1316},"755",[1050,8745,1793],{"class":1135},[1050,8747,8748],{"class":1052,"line":4234},[1050,8749,1331],{"class":1169},[1050,8751,8752,8754],{"class":1052,"line":4251},[1050,8753,3307],{"class":1804},[1050,8755,8756],{"class":1169}," script_filename\n",[1050,8758,8759],{"class":1052,"line":4270},[1050,8760,1064],{"emptyLinePlaceholder":1063},[1050,8762,8763],{"class":1052,"line":4290},[1050,8764,8765],{"class":1056},"# Advanced rollback scenarios\n",[1050,8767,8768,8770,8773],{"class":1052,"line":4295},[1050,8769,1128],{"class":1127},[1050,8771,8772],{"class":1131}," AdvancedRollbackScenarios",[1050,8774,2415],{"class":1135},[1050,8776,8777,8779,8782],{"class":1052,"line":4316},[1050,8778,1156],{"class":1155},[1050,8780,8781],{"class":1159},"Handle complex rollback scenarios",[1050,8783,1163],{"class":1155},[1050,8785,8786],{"class":1052,"line":4347},[1050,8787,1170],{"class":1169},[1050,8789,8790,8792],{"class":1052,"line":4352},[1050,8791,5377],{"class":1135},[1050,8793,5380],{"class":2775},[1050,8795,8796,8798,8801],{"class":1052,"line":4369},[1050,8797,2433],{"class":1127},[1050,8799,8800],{"class":1733}," rollback_with_data_migration",[1050,8802,2354],{"class":1135},[1050,8804,8805,8807,8810],{"class":1052,"line":4407},[1050,8806,2528],{"class":1155},[1050,8808,8809],{"class":1159},"Rollback that includes data migration",[1050,8811,1163],{"class":1155},[1050,8813,8814],{"class":1052,"line":4426},[1050,8815,1331],{"class":1169},[1050,8817,8818,8820,8823,8825,8827,8829,8831],{"class":1052,"line":4445},[1050,8819,6241],{"class":1127},[1050,8821,8822],{"class":1733}," rollback_with_data_preservation",[1050,8824,1136],{"class":1135},[1050,8826,1740],{"class":1739},[1050,8828,1201],{"class":1135},[1050,8830,1745],{"class":1739},[1050,8832,1149],{"class":1135},[1050,8834,8835,8837,8840],{"class":1052,"line":4454},[1050,8836,6259],{"class":1155},[1050,8838,8839],{"class":1159},"Preserve critical data during rollback",[1050,8841,1163],{"class":1155},[1050,8843,8844],{"class":1052,"line":4459},[1050,8845,2995],{"class":1169},[1050,8847,8848,8850,8852,8854,8856,8858,8860,8862,8864,8866,8868,8870,8872,8874],{"class":1052,"line":4467},[1050,8849,6273],{"class":1169},[1050,8851,1179],{"class":1135},[1050,8853,1768],{"class":1169},[1050,8855,1143],{"class":1135},[1050,8857,1773],{"class":1250},[1050,8859,1136],{"class":1135},[1050,8861,1192],{"class":1191},[1050,8863,1196],{"class":1195},[1050,8865,1192],{"class":1191},[1050,8867,1201],{"class":1135},[1050,8869,1204],{"class":1191},[1050,8871,1788],{"class":1195},[1050,8873,1192],{"class":1191},[1050,8875,1793],{"class":1135},[1050,8877,8878],{"class":1052,"line":4486},[1050,8879,2995],{"class":1169},[1050,8881,8882],{"class":1052,"line":4497},[1050,8883,8884],{"class":1056},"            # Export critical data before rollback\n",[1050,8886,8887,8890,8892],{"class":1052,"line":4502},[1050,8888,8889],{"class":1169},"            critical_data ",[1050,8891,1179],{"class":1135},[1050,8893,2935],{"class":1135},[1050,8895,8896],{"class":1052,"line":4507},[1050,8897,2995],{"class":1169},[1050,8899,8900,8902,8904,8906,8908,8910,8912,8914,8916],{"class":1052,"line":4524},[1050,8901,7524],{"class":1804},[1050,8903,1808],{"class":1169},[1050,8905,1811],{"class":1804},[1050,8907,1814],{"class":1169},[1050,8909,1143],{"class":1135},[1050,8911,1820],{"class":1819},[1050,8913,1143],{"class":1135},[1050,8915,2351],{"class":1250},[1050,8917,2354],{"class":1135},[1050,8919,8920,8922,8924,8926,8928,8930,8932,8935,8937,8939,8942,8945,8947,8949],{"class":1052,"line":4555},[1050,8921,7546],{"class":1804},[1050,8923,4091],{"class":2436},[1050,8925,1136],{"class":1135},[1050,8927,1268],{"class":1250},[1050,8929,1201],{"class":1135},[1050,8931,1204],{"class":1191},[1050,8933,8934],{"class":1195},"critical_field",[1050,8936,1192],{"class":1191},[1050,8938,4391],{"class":1135},[1050,8940,8941],{"class":2592}," and",[1050,8943,8944],{"class":1169}," post",[1050,8946,1143],{"class":1135},[1050,8948,8934],{"class":1819},[1050,8950,2415],{"class":1135},[1050,8952,8953,8956,8958,8960],{"class":1052,"line":4581},[1050,8954,8955],{"class":1169},"                    critical_data",[1050,8957,1143],{"class":1135},[1050,8959,3040],{"class":1250},[1050,8961,3043],{"class":1135},[1050,8963,8964,8967,8970,8972,8974,8976,8978,8980],{"class":1052,"line":4600},[1050,8965,8966],{"class":1191},"                        '",[1050,8968,8969],{"class":1195},"post_id",[1050,8971,1192],{"class":1191},[1050,8973,2635],{"class":1135},[1050,8975,8944],{"class":1250},[1050,8977,1143],{"class":1135},[1050,8979,6404],{"class":1819},[1050,8981,1273],{"class":1135},[1050,8983,8984,8986,8989,8991,8993,8995,8997],{"class":1052,"line":4619},[1050,8985,8966],{"class":1191},[1050,8987,8988],{"class":1195},"critical_value",[1050,8990,1192],{"class":1191},[1050,8992,2635],{"class":1135},[1050,8994,8944],{"class":1250},[1050,8996,1143],{"class":1135},[1050,8998,8999],{"class":1819},"critical_field\n",[1050,9001,9002],{"class":1052,"line":4627},[1050,9003,9004],{"class":1135},"                    })\n",[1050,9006,9007],{"class":1052,"line":4632},[1050,9008,2995],{"class":1169},[1050,9010,9011],{"class":1052,"line":4639},[1050,9012,9013],{"class":1056},"            # Store in a safe location\n",[1050,9015,9016,9018,9021],{"class":1052,"line":4658},[1050,9017,2974],{"class":1804},[1050,9019,9020],{"class":1169}," critical_data",[1050,9022,2415],{"class":1135},[1050,9024,9025,9027,9029,9031,9033,9035,9037,9039],{"class":1052,"line":4668},[1050,9026,6433],{"class":1804},[1050,9028,2453],{"class":1169},[1050,9030,1143],{"class":1135},[1050,9032,6440],{"class":1169},[1050,9034,1143],{"class":1135},[1050,9036,6445],{"class":1169},[1050,9038,2470],{"class":1804},[1050,9040,6450],{"class":1169},[1050,9042,9043,9045,9047,9049,9051,9053,9056,9058,9060,9062,9064,9066,9068,9071],{"class":1052,"line":4673},[1050,9044,6455],{"class":1169},[1050,9046,1143],{"class":1135},[1050,9048,6460],{"class":1250},[1050,9050,1136],{"class":1135},[1050,9052,1192],{"class":1191},[1050,9054,9055],{"class":1195},"rollback_critical_data",[1050,9057,1192],{"class":1191},[1050,9059,1201],{"class":1135},[1050,9061,9020],{"class":1250},[1050,9063,1201],{"class":1135},[1050,9065,6479],{"class":1260},[1050,9067,1179],{"class":1135},[1050,9069,9070],{"class":1316},"86400",[1050,9072,1793],{"class":1135},[1050,9074,9075],{"class":1052,"line":4678},[1050,9076,5526],{"class":1169},[1050,9078,9079,9081,9083,9085,9088,9090,9092,9094,9097,9099,9101,9104],{"class":1052,"line":4685},[1050,9080,6495],{"class":2436},[1050,9082,1136],{"class":1135},[1050,9084,6500],{"class":1127},[1050,9086,9087],{"class":1195},"\"Preserved ",[1050,9089,2661],{"class":2660},[1050,9091,6508],{"class":2436},[1050,9093,1136],{"class":1135},[1050,9095,9096],{"class":1250},"critical_data",[1050,9098,4391],{"class":1135},[1050,9100,2666],{"class":2660},[1050,9102,9103],{"class":1195}," critical data records\"",[1050,9105,1793],{"class":1135},[1050,9107,9108],{"class":1052,"line":4690},[1050,9109,1331],{"class":1169},[1050,9111,9112,9114],{"class":1052,"line":4712},[1050,9113,3307],{"class":1804},[1050,9115,9116],{"class":1169}," rollback_with_data_preservation\n",[1050,9118,9119],{"class":1052,"line":4722},[1050,9120,1170],{"class":1169},[1050,9122,9123,9125],{"class":1052,"line":4727},[1050,9124,5377],{"class":1135},[1050,9126,5380],{"class":2775},[1050,9128,9129,9131,9134],{"class":1052,"line":4751},[1050,9130,2433],{"class":1127},[1050,9132,9133],{"class":1733}," partial_rollback_strategy",[1050,9135,2354],{"class":1135},[1050,9137,9138,9140,9143],{"class":1052,"line":4756},[1050,9139,2528],{"class":1155},[1050,9141,9142],{"class":1159},"Strategy for partial rollbacks",[1050,9144,1163],{"class":1155},[1050,9146,9147],{"class":1052,"line":4766},[1050,9148,1331],{"class":1169},[1050,9150,9151,9153,9156,9158,9160,9162,9164],{"class":1052,"line":4787},[1050,9152,6241],{"class":1127},[1050,9154,9155],{"class":1733}," selective_rollback",[1050,9157,1136],{"class":1135},[1050,9159,1740],{"class":1739},[1050,9161,1201],{"class":1135},[1050,9163,1745],{"class":1739},[1050,9165,1149],{"class":1135},[1050,9167,9168,9170,9173],{"class":1052,"line":4801},[1050,9169,6259],{"class":1155},[1050,9171,9172],{"class":1159},"Rollback only specific changes",[1050,9174,1163],{"class":1155},[1050,9176,9177],{"class":1052,"line":4815},[1050,9178,2995],{"class":1169},[1050,9180,9181],{"class":1052,"line":4829},[1050,9182,9183],{"class":1056},"            # This allows rolling back specific parts of a migration\n",[1050,9185,9186],{"class":1052,"line":4843},[1050,9187,9188],{"class":1056},"            # while preserving others\n",[1050,9190,9191],{"class":1052,"line":4848},[1050,9192,2995],{"class":1169},[1050,9194,9195,9197,9199,9201,9203,9205,9207,9209,9211,9213,9215,9217,9219,9221],{"class":1052,"line":4853},[1050,9196,6273],{"class":1169},[1050,9198,1179],{"class":1135},[1050,9200,1768],{"class":1169},[1050,9202,1143],{"class":1135},[1050,9204,1773],{"class":1250},[1050,9206,1136],{"class":1135},[1050,9208,1192],{"class":1191},[1050,9210,1196],{"class":1195},[1050,9212,1192],{"class":1191},[1050,9214,1201],{"class":1135},[1050,9216,1204],{"class":1191},[1050,9218,1788],{"class":1195},[1050,9220,1192],{"class":1191},[1050,9222,1793],{"class":1135},[1050,9224,9225],{"class":1052,"line":4873},[1050,9226,2995],{"class":1169},[1050,9228,9229],{"class":1052,"line":4899},[1050,9230,9231],{"class":1056},"            # Rollback field changes but preserve data\n",[1050,9233,9234,9237,9239,9241,9243,9245,9247,9249],{"class":1052,"line":4919},[1050,9235,9236],{"class":1169},"            posts_to_update ",[1050,9238,1179],{"class":1135},[1050,9240,1814],{"class":1169},[1050,9242,1143],{"class":1135},[1050,9244,1820],{"class":1819},[1050,9246,1143],{"class":1135},[1050,9248,1825],{"class":1250},[1050,9250,1254],{"class":1135},[1050,9252,9253],{"class":1052,"line":4932},[1050,9254,9255],{"class":1056},"                # Condition for selective rollback\n",[1050,9257,9258,9261,9263,9265,9268],{"class":1052,"line":4944},[1050,9259,9260],{"class":1260},"                status",[1050,9262,1179],{"class":1135},[1050,9264,1192],{"class":1191},[1050,9266,9267],{"class":1195},"migrated",[1050,9269,4896],{"class":1191},[1050,9271,9272],{"class":1052,"line":4956},[1050,9273,3875],{"class":1135},[1050,9275,9276],{"class":1052,"line":4966},[1050,9277,2995],{"class":1169},[1050,9279,9280,9282,9284,9286,9289],{"class":1052,"line":4972},[1050,9281,7524],{"class":1804},[1050,9283,1808],{"class":1169},[1050,9285,1811],{"class":1804},[1050,9287,9288],{"class":1169}," posts_to_update",[1050,9290,2415],{"class":1135},[1050,9292,9293],{"class":1052,"line":4977},[1050,9294,9295],{"class":1056},"                # Reverse specific changes\n",[1050,9297,9298,9301,9303,9305,9307,9309,9312],{"class":1052,"line":4994},[1050,9299,9300],{"class":1169},"                post",[1050,9302,1143],{"class":1135},[1050,9304,6051],{"class":1819},[1050,9306,1852],{"class":1135},[1050,9308,1204],{"class":1191},[1050,9310,9311],{"class":1195},"original",[1050,9313,4896],{"class":1191},[1050,9315,9316],{"class":1052,"line":5018},[1050,9317,9318],{"class":1056},"                # Keep other changes intact\n",[1050,9320,9321,9323,9325,9327],{"class":1052,"line":5046},[1050,9322,9300],{"class":1169},[1050,9324,1143],{"class":1135},[1050,9326,1875],{"class":1250},[1050,9328,1878],{"class":1135},[1050,9330,9331],{"class":1052,"line":5065},[1050,9332,1331],{"class":1169},[1050,9334,9335,9337],{"class":1052,"line":5077},[1050,9336,3307],{"class":1804},[1050,9338,9339],{"class":1169}," selective_rollback\n",[1050,9341,9342],{"class":1052,"line":5089},[1050,9343,1170],{"class":1169},[1050,9345,9346,9348],{"class":1052,"line":5101},[1050,9347,5377],{"class":1135},[1050,9349,5380],{"class":2775},[1050,9351,9352,9354,9357],{"class":1052,"line":5111},[1050,9353,2433],{"class":1127},[1050,9355,9356],{"class":1733}," cross_app_rollback_coordination",[1050,9358,2354],{"class":1135},[1050,9360,9361,9363,9366],{"class":1052,"line":5116},[1050,9362,2528],{"class":1155},[1050,9364,9365],{"class":1159},"Coordinate rollbacks across multiple apps",[1050,9367,1163],{"class":1155},[1050,9369,9370],{"class":1052,"line":5121},[1050,9371,1331],{"class":1169},[1050,9373,9374,9376,9379,9381,9383,9385,9387],{"class":1052,"line":5129},[1050,9375,6241],{"class":1127},[1050,9377,9378],{"class":1733}," coordinated_rollback",[1050,9380,1136],{"class":1135},[1050,9382,1740],{"class":1739},[1050,9384,1201],{"class":1135},[1050,9386,1745],{"class":1739},[1050,9388,1149],{"class":1135},[1050,9390,9391,9393,9396],{"class":1052,"line":5148},[1050,9392,6259],{"class":1155},[1050,9394,9395],{"class":1159},"Rollback changes across multiple related apps",[1050,9397,1163],{"class":1155},[1050,9399,9400],{"class":1052,"line":5173},[1050,9401,2995],{"class":1169},[1050,9403,9404],{"class":1052,"line":5185},[1050,9405,9406],{"class":1056},"            # Get models from different apps\n",[1050,9408,9409,9411,9413,9415,9417,9419,9421,9423,9425,9427,9429,9431,9433,9435],{"class":1052,"line":5195},[1050,9410,6273],{"class":1169},[1050,9412,1179],{"class":1135},[1050,9414,1768],{"class":1169},[1050,9416,1143],{"class":1135},[1050,9418,1773],{"class":1250},[1050,9420,1136],{"class":1135},[1050,9422,1192],{"class":1191},[1050,9424,1196],{"class":1195},[1050,9426,1192],{"class":1191},[1050,9428,1201],{"class":1135},[1050,9430,1204],{"class":1191},[1050,9432,1788],{"class":1195},[1050,9434,1192],{"class":1191},[1050,9436,1793],{"class":1135},[1050,9438,9439,9442,9444,9446,9448,9450,9452,9454,9457,9459,9461,9463,9466,9468],{"class":1052,"line":5200},[1050,9440,9441],{"class":1169},"            Comment ",[1050,9443,1179],{"class":1135},[1050,9445,1768],{"class":1169},[1050,9447,1143],{"class":1135},[1050,9449,1773],{"class":1250},[1050,9451,1136],{"class":1135},[1050,9453,1192],{"class":1191},[1050,9455,9456],{"class":1195},"comments",[1050,9458,1192],{"class":1191},[1050,9460,1201],{"class":1135},[1050,9462,1204],{"class":1191},[1050,9464,9465],{"class":1195},"Comment",[1050,9467,1192],{"class":1191},[1050,9469,1793],{"class":1135},[1050,9471,9472,9475,9477,9479,9481,9483,9485,9487,9490,9492,9494,9496,9499,9501],{"class":1052,"line":5205},[1050,9473,9474],{"class":1169},"            UserProfile ",[1050,9476,1179],{"class":1135},[1050,9478,1768],{"class":1169},[1050,9480,1143],{"class":1135},[1050,9482,1773],{"class":1250},[1050,9484,1136],{"class":1135},[1050,9486,1192],{"class":1191},[1050,9488,9489],{"class":1195},"accounts",[1050,9491,1192],{"class":1191},[1050,9493,1201],{"class":1135},[1050,9495,1204],{"class":1191},[1050,9497,9498],{"class":1195},"UserProfile",[1050,9500,1192],{"class":1191},[1050,9502,1793],{"class":1135},[1050,9504,9505],{"class":1052,"line":5211},[1050,9506,2995],{"class":1169},[1050,9508,9509],{"class":1052,"line":5241},[1050,9510,9511],{"class":1056},"            # Coordinate rollback to maintain referential integrity\n",[1050,9513,9514],{"class":1052,"line":5246},[1050,9515,2995],{"class":1169},[1050,9517,9518],{"class":1052,"line":5252},[1050,9519,9520],{"class":1056},"            # Step 1: Handle dependent data\n",[1050,9522,9523,9526,9528,9530,9532,9534],{"class":1052,"line":5269},[1050,9524,9525],{"class":1169},"            Comment",[1050,9527,1143],{"class":1135},[1050,9529,1820],{"class":1819},[1050,9531,1143],{"class":1135},[1050,9533,1825],{"class":1250},[1050,9535,1254],{"class":1135},[1050,9537,9538,9541,9543,9545,9547,9549,9551,9553,9555,9557,9559,9561,9564,9566],{"class":1052,"line":5288},[1050,9539,9540],{"class":1260},"                post__in",[1050,9542,1179],{"class":1135},[1050,9544,1788],{"class":1250},[1050,9546,1143],{"class":1135},[1050,9548,1820],{"class":1819},[1050,9550,1143],{"class":1135},[1050,9552,1825],{"class":1250},[1050,9554,1136],{"class":1135},[1050,9556,6051],{"class":1260},[1050,9558,1179],{"class":1135},[1050,9560,1192],{"class":1191},[1050,9562,9563],{"class":1195},"to_rollback",[1050,9565,1192],{"class":1191},[1050,9567,1793],{"class":1135},[1050,9569,9570,9572,9574,9576,9578,9580,9582,9585,9587],{"class":1052,"line":5300},[1050,9571,6342],{"class":1135},[1050,9573,1982],{"class":1250},[1050,9575,1136],{"class":1135},[1050,9577,6051],{"class":1260},[1050,9579,1179],{"class":1135},[1050,9581,1192],{"class":1191},[1050,9583,9584],{"class":1195},"archived",[1050,9586,1192],{"class":1191},[1050,9588,1793],{"class":1135},[1050,9590,9591],{"class":1052,"line":5312},[1050,9592,2995],{"class":1169},[1050,9594,9595],{"class":1052,"line":5322},[1050,9596,9597],{"class":1056},"            # Step 2: Rollback main changes\n",[1050,9599,9600,9602,9604,9606,9608,9610,9612,9614,9616,9618,9620,9622,9624,9626],{"class":1052,"line":5327},[1050,9601,6536],{"class":1169},[1050,9603,1143],{"class":1135},[1050,9605,1820],{"class":1819},[1050,9607,1143],{"class":1135},[1050,9609,1825],{"class":1250},[1050,9611,1136],{"class":1135},[1050,9613,6051],{"class":1260},[1050,9615,1179],{"class":1135},[1050,9617,1192],{"class":1191},[1050,9619,9563],{"class":1195},[1050,9621,1192],{"class":1191},[1050,9623,1979],{"class":1135},[1050,9625,1982],{"class":1250},[1050,9627,1254],{"class":1135},[1050,9629,9630,9632,9634,9636,9639],{"class":1052,"line":5332},[1050,9631,9260],{"class":1260},[1050,9633,1179],{"class":1135},[1050,9635,1192],{"class":1191},[1050,9637,9638],{"class":1195},"published",[1050,9640,4896],{"class":1191},[1050,9642,9644],{"class":1052,"line":9643},218,[1050,9645,3875],{"class":1135},[1050,9647,9649],{"class":1052,"line":9648},219,[1050,9650,2995],{"class":1169},[1050,9652,9654],{"class":1052,"line":9653},220,[1050,9655,9656],{"class":1056},"            # Step 3: Update related models\n",[1050,9658,9660,9663,9665,9667,9669,9671],{"class":1052,"line":9659},221,[1050,9661,9662],{"class":1169},"            UserProfile",[1050,9664,1143],{"class":1135},[1050,9666,1820],{"class":1819},[1050,9668,1143],{"class":1135},[1050,9670,1825],{"class":1250},[1050,9672,1254],{"class":1135},[1050,9674,9676,9679,9681,9683,9685],{"class":1052,"line":9675},222,[1050,9677,9678],{"class":1260},"                user__post__status",[1050,9680,1179],{"class":1135},[1050,9682,1192],{"class":1191},[1050,9684,9638],{"class":1195},[1050,9686,4896],{"class":1191},[1050,9688,9690,9692,9694,9696,9699,9701,9703,9705,9707,9709,9711,9713,9716,9719],{"class":1052,"line":9689},223,[1050,9691,6342],{"class":1135},[1050,9693,1982],{"class":1250},[1050,9695,1136],{"class":1135},[1050,9697,9698],{"class":1260},"post_count",[1050,9700,1179],{"class":1135},[1050,9702,6989],{"class":1250},[1050,9704,1136],{"class":1135},[1050,9706,1192],{"class":1191},[1050,9708,9698],{"class":1195},[1050,9710,1192],{"class":1191},[1050,9712,4391],{"class":1135},[1050,9714,9715],{"class":2592}," +",[1050,9717,9718],{"class":1316}," 1",[1050,9720,1793],{"class":1135},[1050,9722,9724],{"class":1052,"line":9723},224,[1050,9725,1331],{"class":1169},[1050,9727,9729,9731],{"class":1052,"line":9728},225,[1050,9730,3307],{"class":1804},[1050,9732,9733],{"class":1169}," coordinated_rollback\n",[1030,9735,9737],{"id":9736},"production-rollback-considerations","Production Rollback Considerations",[1035,9739,9741],{"id":9740},"production-safe-rollback-procedures","Production-Safe Rollback Procedures",[1040,9743,9745],{"className":1042,"code":9744,"language":1044,"meta":1045,"style":1045},"class ProductionRollbackManager:\n    \"\"\"Manage rollbacks in production environments\"\"\"\n    \n    @staticmethod\n    def validate_production_rollback(app_label, target_migration):\n        \"\"\"Validate rollback safety for production\"\"\"\n        \n        validation_results = {\n            'safe_for_production': True,\n            'blocking_issues': [],\n            'warnings': [],\n            'required_actions': [],\n            'estimated_downtime': 'unknown'\n        }\n        \n        # Check for data loss risks\n        analyzer = RollbackSafetyAnalyzer()\n        safety_analysis = analyzer.analyze_rollback_safety(app_label, target_migration)\n        \n        if safety_analysis['data_loss_risk']:\n            validation_results['safe_for_production'] = False\n            validation_results['blocking_issues'].append(\n                \"Rollback involves data loss - not safe for production\"\n            )\n        \n        if safety_analysis['irreversible_operations']:\n            validation_results['safe_for_production'] = False\n            validation_results['blocking_issues'].append(\n                \"Rollback contains irreversible operations\"\n            )\n        \n        # Check for high-impact operations\n        if len(safety_analysis['affected_tables']) > 5:\n            validation_results['warnings'].append(\n                f\"Rollback affects {len(safety_analysis['affected_tables'])} tables\"\n            )\n            validation_results['estimated_downtime'] = 'high'\n        \n        # Add required actions for production\n        validation_results['required_actions'].extend([\n            \"Create full database backup\",\n            \"Schedule maintenance window\",\n            \"Notify stakeholders\",\n            \"Prepare rollback verification checklist\",\n            \"Have rollforward plan ready\"\n        ])\n        \n        return validation_results\n    \n    @staticmethod\n    def create_production_rollback_plan(app_label, target_migration):\n        \"\"\"Create comprehensive rollback plan for production\"\"\"\n        \n        plan = {\n            'pre_rollback': [],\n            'rollback_steps': [],\n            'post_rollback': [],\n            'verification': [],\n            'rollforward_plan': [],\n            'communication': []\n        }\n        \n        # Pre-rollback steps\n        plan['pre_rollback'].extend([\n            \"1. Announce maintenance window\",\n            \"2. Create database backup\",\n            \"3. Export critical data\",\n            \"4. Stop application servers\",\n            \"5. Verify backup integrity\"\n        ])\n        \n        # Rollback steps\n        plan['rollback_steps'].extend([\n            f\"1. python manage.py migrate {app_label} {target_migration}\",\n            \"2. Verify migration state\",\n            \"3. Check database consistency\",\n            \"4. Run application health checks\"\n        ])\n        \n        # Post-rollback steps\n        plan['post_rollback'].extend([\n            \"1. Start application servers\",\n            \"2. Verify application functionality\",\n            \"3. Monitor error logs\",\n            \"4. Check performance metrics\",\n            \"5. Notify stakeholders of completion\"\n        ])\n        \n        # Verification checklist\n        plan['verification'].extend([\n            \"Database schema matches expected state\",\n            \"All application features work correctly\",\n            \"No data corruption detected\",\n            \"Performance metrics within normal range\",\n            \"Error rates within acceptable limits\"\n        ])\n        \n        # Rollforward plan (in case rollback fails)\n        plan['rollforward_plan'].extend([\n            \"1. Restore from backup if rollback fails\",\n            \"2. Apply migrations forward to known good state\",\n            \"3. Implement hotfix if needed\",\n            \"4. Schedule proper fix for next maintenance window\"\n        ])\n        \n        return plan\n    \n    @staticmethod\n    def monitor_rollback_progress():\n        \"\"\"Monitor rollback progress in production\"\"\"\n        \n        import time\n        import psutil\n        from django.db import connection\n        \n        monitoring_data = {\n            'start_time': time.time(),\n            'checkpoints': [],\n            'performance_metrics': [],\n            'error_log': []\n        }\n        \n        def log_checkpoint(message):\n            monitoring_data['checkpoints'].append({\n                'timestamp': time.time(),\n                'message': message,\n                'elapsed': time.time() - monitoring_data['start_time']\n            })\n            print(f\"[{time.time() - monitoring_data['start_time']:.1f}s] {message}\")\n        \n        def log_performance():\n            monitoring_data['performance_metrics'].append({\n                'timestamp': time.time(),\n                'cpu_percent': psutil.cpu_percent(),\n                'memory_percent': psutil.virtual_memory().percent,\n                'db_connections': len(connection.queries)\n            })\n        \n        return log_checkpoint, log_performance, monitoring_data\n",[1047,9746,9747,9756,9765,9769,9775,9792,9801,9805,9814,9829,9842,9854,9867,9885,9889,9893,9898,9909,9932,9936,9952,9971,9989,9998,10002,10006,10022,10040,10058,10067,10071,10075,10080,10111,10129,10159,10163,10186,10190,10195,10214,10225,10236,10247,10258,10267,10271,10275,10282,10286,10292,10309,10318,10322,10331,10344,10357,10370,10383,10396,10409,10413,10417,10422,10441,10452,10463,10474,10485,10494,10498,10502,10507,10525,10548,10559,10570,10579,10583,10587,10592,10610,10621,10631,10642,10653,10662,10666,10670,10675,10693,10704,10715,10726,10737,10746,10750,10754,10759,10777,10788,10799,10810,10819,10823,10827,10834,10838,10844,10853,10862,10866,10873,10880,10894,10898,10907,10928,10941,10954,10967,10971,10975,10989,11008,11026,11041,11075,11079,11133,11137,11146,11164,11182,11202,11227,11251,11255,11259],{"__ignoreMap":1045},[1050,9748,9749,9751,9754],{"class":1052,"line":1053},[1050,9750,1128],{"class":1127},[1050,9752,9753],{"class":1131}," ProductionRollbackManager",[1050,9755,2415],{"class":1135},[1050,9757,9758,9760,9763],{"class":1052,"line":1060},[1050,9759,1156],{"class":1155},[1050,9761,9762],{"class":1159},"Manage rollbacks in production environments",[1050,9764,1163],{"class":1155},[1050,9766,9767],{"class":1052,"line":1067},[1050,9768,1170],{"class":1169},[1050,9770,9771,9773],{"class":1052,"line":1073},[1050,9772,5377],{"class":1135},[1050,9774,5380],{"class":2775},[1050,9776,9777,9779,9782,9784,9786,9788,9790],{"class":1052,"line":1079},[1050,9778,2433],{"class":1127},[1050,9780,9781],{"class":1733}," validate_production_rollback",[1050,9783,1136],{"class":1135},[1050,9785,2571],{"class":1739},[1050,9787,1201],{"class":1135},[1050,9789,2521],{"class":1739},[1050,9791,1149],{"class":1135},[1050,9793,9794,9796,9799],{"class":1052,"line":1084},[1050,9795,2528],{"class":1155},[1050,9797,9798],{"class":1159},"Validate rollback safety for production",[1050,9800,1163],{"class":1155},[1050,9802,9803],{"class":1052,"line":1090},[1050,9804,1331],{"class":1169},[1050,9806,9807,9810,9812],{"class":1052,"line":1096},[1050,9808,9809],{"class":1169},"        validation_results ",[1050,9811,1179],{"class":1135},[1050,9813,2622],{"class":1135},[1050,9815,9816,9818,9821,9823,9825,9827],{"class":1052,"line":1101},[1050,9817,2851],{"class":1191},[1050,9819,9820],{"class":1195},"safe_for_production",[1050,9822,1192],{"class":1191},[1050,9824,2635],{"class":1135},[1050,9826,2860],{"class":1835},[1050,9828,1273],{"class":1135},[1050,9830,9831,9833,9836,9838,9840],{"class":1052,"line":1107},[1050,9832,2851],{"class":1191},[1050,9834,9835],{"class":1195},"blocking_issues",[1050,9837,1192],{"class":1191},[1050,9839,2635],{"class":1135},[1050,9841,2876],{"class":1135},[1050,9843,9844,9846,9848,9850,9852],{"class":1052,"line":1113},[1050,9845,2851],{"class":1191},[1050,9847,2869],{"class":1195},[1050,9849,1192],{"class":1191},[1050,9851,2635],{"class":1135},[1050,9853,2876],{"class":1135},[1050,9855,9856,9858,9861,9863,9865],{"class":1052,"line":1118},[1050,9857,2851],{"class":1191},[1050,9859,9860],{"class":1195},"required_actions",[1050,9862,1192],{"class":1191},[1050,9864,2635],{"class":1135},[1050,9866,2876],{"class":1135},[1050,9868,9869,9871,9874,9876,9878,9880,9883],{"class":1052,"line":1124},[1050,9870,2851],{"class":1191},[1050,9872,9873],{"class":1195},"estimated_downtime",[1050,9875,1192],{"class":1191},[1050,9877,2635],{"class":1135},[1050,9879,1204],{"class":1191},[1050,9881,9882],{"class":1195},"unknown",[1050,9884,4896],{"class":1191},[1050,9886,9887],{"class":1052,"line":1152},[1050,9888,2940],{"class":1135},[1050,9890,9891],{"class":1052,"line":1166},[1050,9892,1331],{"class":1169},[1050,9894,9895],{"class":1052,"line":1173},[1050,9896,9897],{"class":1056},"        # Check for data loss risks\n",[1050,9899,9900,9903,9905,9907],{"class":1052,"line":1185},[1050,9901,9902],{"class":1169},"        analyzer ",[1050,9904,1179],{"class":1135},[1050,9906,2412],{"class":1250},[1050,9908,1878],{"class":1135},[1050,9910,9911,9913,9915,9918,9920,9922,9924,9926,9928,9930],{"class":1052,"line":1215},[1050,9912,2842],{"class":1169},[1050,9914,1179],{"class":1135},[1050,9916,9917],{"class":1169}," analyzer",[1050,9919,1143],{"class":1135},[1050,9921,4738],{"class":1250},[1050,9923,1136],{"class":1135},[1050,9925,2571],{"class":1250},[1050,9927,1201],{"class":1135},[1050,9929,2521],{"class":1250},[1050,9931,1793],{"class":1135},[1050,9933,9934],{"class":1052,"line":1221},[1050,9935,1331],{"class":1169},[1050,9937,9938,9940,9942,9944,9946,9948,9950],{"class":1052,"line":1226},[1050,9939,2586],{"class":1804},[1050,9941,4860],{"class":1169},[1050,9943,3028],{"class":1135},[1050,9945,1192],{"class":1191},[1050,9947,2883],{"class":1195},[1050,9949,1192],{"class":1191},[1050,9951,3133],{"class":1135},[1050,9953,9954,9957,9959,9961,9963,9965,9967,9969],{"class":1052,"line":1236},[1050,9955,9956],{"class":1169},"            validation_results",[1050,9958,3028],{"class":1135},[1050,9960,1192],{"class":1191},[1050,9962,9820],{"class":1195},[1050,9964,1192],{"class":1191},[1050,9966,3149],{"class":1135},[1050,9968,1852],{"class":1135},[1050,9970,3154],{"class":1835},[1050,9972,9973,9975,9977,9979,9981,9983,9985,9987],{"class":1052,"line":1242},[1050,9974,9956],{"class":1169},[1050,9976,3028],{"class":1135},[1050,9978,1192],{"class":1191},[1050,9980,9835],{"class":1195},[1050,9982,1192],{"class":1191},[1050,9984,3037],{"class":1135},[1050,9986,3040],{"class":1250},[1050,9988,1254],{"class":1135},[1050,9990,9991,9993,9996],{"class":1052,"line":1257},[1050,9992,4922],{"class":1191},[1050,9994,9995],{"class":1195},"Rollback involves data loss - not safe for production",[1050,9997,2829],{"class":1191},[1050,9999,10000],{"class":1052,"line":1276},[1050,10001,3875],{"class":1135},[1050,10003,10004],{"class":1052,"line":1293},[1050,10005,1331],{"class":1169},[1050,10007,10008,10010,10012,10014,10016,10018,10020],{"class":1052,"line":1322},[1050,10009,2586],{"class":1804},[1050,10011,4860],{"class":1169},[1050,10013,3028],{"class":1135},[1050,10015,1192],{"class":1191},[1050,10017,2898],{"class":1195},[1050,10019,1192],{"class":1191},[1050,10021,3133],{"class":1135},[1050,10023,10024,10026,10028,10030,10032,10034,10036,10038],{"class":1052,"line":1328},[1050,10025,9956],{"class":1169},[1050,10027,3028],{"class":1135},[1050,10029,1192],{"class":1191},[1050,10031,9820],{"class":1195},[1050,10033,1192],{"class":1191},[1050,10035,3149],{"class":1135},[1050,10037,1852],{"class":1135},[1050,10039,3154],{"class":1835},[1050,10041,10042,10044,10046,10048,10050,10052,10054,10056],{"class":1052,"line":1334},[1050,10043,9956],{"class":1169},[1050,10045,3028],{"class":1135},[1050,10047,1192],{"class":1191},[1050,10049,9835],{"class":1195},[1050,10051,1192],{"class":1191},[1050,10053,3037],{"class":1135},[1050,10055,3040],{"class":1250},[1050,10057,1254],{"class":1135},[1050,10059,10060,10062,10065],{"class":1052,"line":1340},[1050,10061,4922],{"class":1191},[1050,10063,10064],{"class":1195},"Rollback contains irreversible operations",[1050,10066,2829],{"class":1191},[1050,10068,10069],{"class":1052,"line":1352},[1050,10070,3875],{"class":1135},[1050,10072,10073],{"class":1052,"line":1367},[1050,10074,1331],{"class":1169},[1050,10076,10077],{"class":1052,"line":1383},[1050,10078,10079],{"class":1056},"        # Check for high-impact operations\n",[1050,10081,10082,10084,10087,10089,10092,10094,10096,10098,10100,10103,10106,10109],{"class":1052,"line":1413},[1050,10083,2586],{"class":1804},[1050,10085,10086],{"class":2436}," len",[1050,10088,1136],{"class":1135},[1050,10090,10091],{"class":1250},"safety_analysis",[1050,10093,3028],{"class":1135},[1050,10095,1192],{"class":1191},[1050,10097,2911],{"class":1195},[1050,10099,1192],{"class":1191},[1050,10101,10102],{"class":1135},"])",[1050,10104,10105],{"class":2592}," >",[1050,10107,10108],{"class":1316}," 5",[1050,10110,2415],{"class":1135},[1050,10112,10113,10115,10117,10119,10121,10123,10125,10127],{"class":1052,"line":1418},[1050,10114,9956],{"class":1169},[1050,10116,3028],{"class":1135},[1050,10118,1192],{"class":1191},[1050,10120,2869],{"class":1195},[1050,10122,1192],{"class":1191},[1050,10124,3037],{"class":1135},[1050,10126,3040],{"class":1250},[1050,10128,1254],{"class":1135},[1050,10130,10131,10133,10136,10138,10140,10142,10144,10146,10148,10150,10152,10154,10156],{"class":1052,"line":1423},[1050,10132,3854],{"class":1127},[1050,10134,10135],{"class":1195},"\"Rollback affects ",[1050,10137,2661],{"class":2660},[1050,10139,6508],{"class":2436},[1050,10141,1136],{"class":1135},[1050,10143,10091],{"class":1250},[1050,10145,3028],{"class":1135},[1050,10147,1192],{"class":1191},[1050,10149,2911],{"class":1195},[1050,10151,1192],{"class":1191},[1050,10153,10102],{"class":1135},[1050,10155,2666],{"class":2660},[1050,10157,10158],{"class":1195}," tables\"\n",[1050,10160,10161],{"class":1052,"line":1429},[1050,10162,3875],{"class":1135},[1050,10164,10165,10167,10169,10171,10173,10175,10177,10179,10181,10184],{"class":1052,"line":1441},[1050,10166,9956],{"class":1169},[1050,10168,3028],{"class":1135},[1050,10170,1192],{"class":1191},[1050,10172,9873],{"class":1195},[1050,10174,1192],{"class":1191},[1050,10176,3149],{"class":1135},[1050,10178,1852],{"class":1135},[1050,10180,1204],{"class":1191},[1050,10182,10183],{"class":1195},"high",[1050,10185,4896],{"class":1191},[1050,10187,10188],{"class":1052,"line":1456},[1050,10189,1331],{"class":1169},[1050,10191,10192],{"class":1052,"line":1502},[1050,10193,10194],{"class":1056},"        # Add required actions for production\n",[1050,10196,10197,10200,10202,10204,10206,10208,10210,10212],{"class":1052,"line":1507},[1050,10198,10199],{"class":1169},"        validation_results",[1050,10201,3028],{"class":1135},[1050,10203,1192],{"class":1191},[1050,10205,9860],{"class":1195},[1050,10207,1192],{"class":1191},[1050,10209,3037],{"class":1135},[1050,10211,3171],{"class":1250},[1050,10213,4916],{"class":1135},[1050,10215,10216,10218,10221,10223],{"class":1052,"line":1512},[1050,10217,8326],{"class":1191},[1050,10219,10220],{"class":1195},"Create full database backup",[1050,10222,1631],{"class":1191},[1050,10224,1273],{"class":1135},[1050,10226,10227,10229,10232,10234],{"class":1052,"line":1517},[1050,10228,8326],{"class":1191},[1050,10230,10231],{"class":1195},"Schedule maintenance window",[1050,10233,1631],{"class":1191},[1050,10235,1273],{"class":1135},[1050,10237,10238,10240,10243,10245],{"class":1052,"line":1523},[1050,10239,8326],{"class":1191},[1050,10241,10242],{"class":1195},"Notify stakeholders",[1050,10244,1631],{"class":1191},[1050,10246,1273],{"class":1135},[1050,10248,10249,10251,10254,10256],{"class":1052,"line":1540},[1050,10250,8326],{"class":1191},[1050,10252,10253],{"class":1195},"Prepare rollback verification checklist",[1050,10255,1631],{"class":1191},[1050,10257,1273],{"class":1135},[1050,10259,10260,10262,10265],{"class":1052,"line":1550},[1050,10261,8326],{"class":1191},[1050,10263,10264],{"class":1195},"Have rollforward plan ready",[1050,10266,2829],{"class":1191},[1050,10268,10269],{"class":1052,"line":1555},[1050,10270,8369],{"class":1135},[1050,10272,10273],{"class":1052,"line":1564},[1050,10274,1331],{"class":1169},[1050,10276,10277,10279],{"class":1052,"line":1586},[1050,10278,3307],{"class":1804},[1050,10280,10281],{"class":1169}," validation_results\n",[1050,10283,10284],{"class":1052,"line":1591},[1050,10285,1170],{"class":1169},[1050,10287,10288,10290],{"class":1052,"line":1596},[1050,10289,5377],{"class":1135},[1050,10291,5380],{"class":2775},[1050,10293,10294,10296,10299,10301,10303,10305,10307],{"class":1052,"line":1605},[1050,10295,2433],{"class":1127},[1050,10297,10298],{"class":1733}," create_production_rollback_plan",[1050,10300,1136],{"class":1135},[1050,10302,2571],{"class":1739},[1050,10304,1201],{"class":1135},[1050,10306,2521],{"class":1739},[1050,10308,1149],{"class":1135},[1050,10310,10311,10313,10316],{"class":1052,"line":1611},[1050,10312,2528],{"class":1155},[1050,10314,10315],{"class":1159},"Create comprehensive rollback plan for production",[1050,10317,1163],{"class":1155},[1050,10319,10320],{"class":1052,"line":1623},[1050,10321,1331],{"class":1169},[1050,10323,10324,10327,10329],{"class":1052,"line":1641},[1050,10325,10326],{"class":1169},"        plan ",[1050,10328,1179],{"class":1135},[1050,10330,2622],{"class":1135},[1050,10332,10333,10335,10338,10340,10342],{"class":1052,"line":1658},[1050,10334,2851],{"class":1191},[1050,10336,10337],{"class":1195},"pre_rollback",[1050,10339,1192],{"class":1191},[1050,10341,2635],{"class":1135},[1050,10343,2876],{"class":1135},[1050,10345,10346,10348,10351,10353,10355],{"class":1052,"line":1663},[1050,10347,2851],{"class":1191},[1050,10349,10350],{"class":1195},"rollback_steps",[1050,10352,1192],{"class":1191},[1050,10354,2635],{"class":1135},[1050,10356,2876],{"class":1135},[1050,10358,10359,10361,10364,10366,10368],{"class":1052,"line":1668},[1050,10360,2851],{"class":1191},[1050,10362,10363],{"class":1195},"post_rollback",[1050,10365,1192],{"class":1191},[1050,10367,2635],{"class":1135},[1050,10369,2876],{"class":1135},[1050,10371,10372,10374,10377,10379,10381],{"class":1052,"line":1674},[1050,10373,2851],{"class":1191},[1050,10375,10376],{"class":1195},"verification",[1050,10378,1192],{"class":1191},[1050,10380,2635],{"class":1135},[1050,10382,2876],{"class":1135},[1050,10384,10385,10387,10390,10392,10394],{"class":1052,"line":1686},[1050,10386,2851],{"class":1191},[1050,10388,10389],{"class":1195},"rollforward_plan",[1050,10391,1192],{"class":1191},[1050,10393,2635],{"class":1135},[1050,10395,2876],{"class":1135},[1050,10397,10398,10400,10403,10405,10407],{"class":1052,"line":1699},[1050,10399,2851],{"class":1191},[1050,10401,10402],{"class":1195},"communication",[1050,10404,1192],{"class":1191},[1050,10406,2635],{"class":1135},[1050,10408,2935],{"class":1135},[1050,10410,10411],{"class":1052,"line":1712},[1050,10412,2940],{"class":1135},[1050,10414,10415],{"class":1052,"line":1717},[1050,10416,1331],{"class":1169},[1050,10418,10419],{"class":1052,"line":1722},[1050,10420,10421],{"class":1056},"        # Pre-rollback steps\n",[1050,10423,10424,10427,10429,10431,10433,10435,10437,10439],{"class":1052,"line":1727},[1050,10425,10426],{"class":1169},"        plan",[1050,10428,3028],{"class":1135},[1050,10430,1192],{"class":1191},[1050,10432,10337],{"class":1195},[1050,10434,1192],{"class":1191},[1050,10436,3037],{"class":1135},[1050,10438,3171],{"class":1250},[1050,10440,4916],{"class":1135},[1050,10442,10443,10445,10448,10450],{"class":1052,"line":1750},[1050,10444,8326],{"class":1191},[1050,10446,10447],{"class":1195},"1. Announce maintenance window",[1050,10449,1631],{"class":1191},[1050,10451,1273],{"class":1135},[1050,10453,10454,10456,10459,10461],{"class":1052,"line":1760},[1050,10455,8326],{"class":1191},[1050,10457,10458],{"class":1195},"2. Create database backup",[1050,10460,1631],{"class":1191},[1050,10462,1273],{"class":1135},[1050,10464,10465,10467,10470,10472],{"class":1052,"line":1796},[1050,10466,8326],{"class":1191},[1050,10468,10469],{"class":1195},"3. Export critical data",[1050,10471,1631],{"class":1191},[1050,10473,1273],{"class":1135},[1050,10475,10476,10478,10481,10483],{"class":1052,"line":1801},[1050,10477,8326],{"class":1191},[1050,10479,10480],{"class":1195},"4. Stop application servers",[1050,10482,1631],{"class":1191},[1050,10484,1273],{"class":1135},[1050,10486,10487,10489,10492],{"class":1052,"line":1841},[1050,10488,8326],{"class":1191},[1050,10490,10491],{"class":1195},"5. Verify backup integrity",[1050,10493,2829],{"class":1191},[1050,10495,10496],{"class":1052,"line":1868},[1050,10497,8369],{"class":1135},[1050,10499,10500],{"class":1052,"line":1881},[1050,10501,1331],{"class":1169},[1050,10503,10504],{"class":1052,"line":1886},[1050,10505,10506],{"class":1056},"        # Rollback steps\n",[1050,10508,10509,10511,10513,10515,10517,10519,10521,10523],{"class":1052,"line":1904},[1050,10510,10426],{"class":1169},[1050,10512,3028],{"class":1135},[1050,10514,1192],{"class":1191},[1050,10516,10350],{"class":1195},[1050,10518,1192],{"class":1191},[1050,10520,3037],{"class":1135},[1050,10522,3171],{"class":1250},[1050,10524,4916],{"class":1135},[1050,10526,10527,10529,10532,10534,10536,10538,10540,10542,10544,10546],{"class":1052,"line":1914},[1050,10528,8693],{"class":1127},[1050,10530,10531],{"class":1195},"\"1. python manage.py migrate ",[1050,10533,2661],{"class":2660},[1050,10535,2571],{"class":1250},[1050,10537,2666],{"class":2660},[1050,10539,5162],{"class":2660},[1050,10541,2673],{"class":1250},[1050,10543,2666],{"class":2660},[1050,10545,1631],{"class":1195},[1050,10547,1273],{"class":1135},[1050,10549,10550,10552,10555,10557],{"class":1052,"line":1945},[1050,10551,8326],{"class":1191},[1050,10553,10554],{"class":1195},"2. Verify migration state",[1050,10556,1631],{"class":1191},[1050,10558,1273],{"class":1135},[1050,10560,10561,10563,10566,10568],{"class":1052,"line":1950},[1050,10562,8326],{"class":1191},[1050,10564,10565],{"class":1195},"3. Check database consistency",[1050,10567,1631],{"class":1191},[1050,10569,1273],{"class":1135},[1050,10571,10572,10574,10577],{"class":1052,"line":1956},[1050,10573,8326],{"class":1191},[1050,10575,10576],{"class":1195},"4. Run application health checks",[1050,10578,2829],{"class":1191},[1050,10580,10581],{"class":1052,"line":1996},[1050,10582,8369],{"class":1135},[1050,10584,10585],{"class":1052,"line":2001},[1050,10586,1331],{"class":1169},[1050,10588,10589],{"class":1052,"line":2007},[1050,10590,10591],{"class":1056},"        # Post-rollback steps\n",[1050,10593,10594,10596,10598,10600,10602,10604,10606,10608],{"class":1052,"line":2024},[1050,10595,10426],{"class":1169},[1050,10597,3028],{"class":1135},[1050,10599,1192],{"class":1191},[1050,10601,10363],{"class":1195},[1050,10603,1192],{"class":1191},[1050,10605,3037],{"class":1135},[1050,10607,3171],{"class":1250},[1050,10609,4916],{"class":1135},[1050,10611,10612,10614,10617,10619],{"class":1052,"line":2034},[1050,10613,8326],{"class":1191},[1050,10615,10616],{"class":1195},"1. Start application servers",[1050,10618,1631],{"class":1191},[1050,10620,1273],{"class":1135},[1050,10622,10623,10625,10627,10629],{"class":1052,"line":2039},[1050,10624,8326],{"class":1191},[1050,10626,5178],{"class":1195},[1050,10628,1631],{"class":1191},[1050,10630,1273],{"class":1135},[1050,10632,10633,10635,10638,10640],{"class":1052,"line":2048},[1050,10634,8326],{"class":1191},[1050,10636,10637],{"class":1195},"3. Monitor error logs",[1050,10639,1631],{"class":1191},[1050,10641,1273],{"class":1135},[1050,10643,10644,10646,10649,10651],{"class":1052,"line":2070},[1050,10645,8326],{"class":1191},[1050,10647,10648],{"class":1195},"4. Check performance metrics",[1050,10650,1631],{"class":1191},[1050,10652,1273],{"class":1135},[1050,10654,10655,10657,10660],{"class":1052,"line":2075},[1050,10656,8326],{"class":1191},[1050,10658,10659],{"class":1195},"5. Notify stakeholders of completion",[1050,10661,2829],{"class":1191},[1050,10663,10664],{"class":1052,"line":2080},[1050,10665,8369],{"class":1135},[1050,10667,10668],{"class":1052,"line":2089},[1050,10669,1331],{"class":1169},[1050,10671,10672],{"class":1052,"line":2095},[1050,10673,10674],{"class":1056},"        # Verification checklist\n",[1050,10676,10677,10679,10681,10683,10685,10687,10689,10691],{"class":1052,"line":2107},[1050,10678,10426],{"class":1169},[1050,10680,3028],{"class":1135},[1050,10682,1192],{"class":1191},[1050,10684,10376],{"class":1195},[1050,10686,1192],{"class":1191},[1050,10688,3037],{"class":1135},[1050,10690,3171],{"class":1250},[1050,10692,4916],{"class":1135},[1050,10694,10695,10697,10700,10702],{"class":1052,"line":2122},[1050,10696,8326],{"class":1191},[1050,10698,10699],{"class":1195},"Database schema matches expected state",[1050,10701,1631],{"class":1191},[1050,10703,1273],{"class":1135},[1050,10705,10706,10708,10711,10713],{"class":1052,"line":2138},[1050,10707,8326],{"class":1191},[1050,10709,10710],{"class":1195},"All application features work correctly",[1050,10712,1631],{"class":1191},[1050,10714,1273],{"class":1135},[1050,10716,10717,10719,10722,10724],{"class":1052,"line":2143},[1050,10718,8326],{"class":1191},[1050,10720,10721],{"class":1195},"No data corruption detected",[1050,10723,1631],{"class":1191},[1050,10725,1273],{"class":1135},[1050,10727,10728,10730,10733,10735],{"class":1052,"line":2148},[1050,10729,8326],{"class":1191},[1050,10731,10732],{"class":1195},"Performance metrics within normal range",[1050,10734,1631],{"class":1191},[1050,10736,1273],{"class":1135},[1050,10738,10739,10741,10744],{"class":1052,"line":2154},[1050,10740,8326],{"class":1191},[1050,10742,10743],{"class":1195},"Error rates within acceptable limits",[1050,10745,2829],{"class":1191},[1050,10747,10748],{"class":1052,"line":2165},[1050,10749,8369],{"class":1135},[1050,10751,10752],{"class":1052,"line":2177},[1050,10753,1331],{"class":1169},[1050,10755,10756],{"class":1052,"line":2200},[1050,10757,10758],{"class":1056},"        # Rollforward plan (in case rollback fails)\n",[1050,10760,10761,10763,10765,10767,10769,10771,10773,10775],{"class":1052,"line":2205},[1050,10762,10426],{"class":1169},[1050,10764,3028],{"class":1135},[1050,10766,1192],{"class":1191},[1050,10768,10389],{"class":1195},[1050,10770,1192],{"class":1191},[1050,10772,3037],{"class":1135},[1050,10774,3171],{"class":1250},[1050,10776,4916],{"class":1135},[1050,10778,10779,10781,10784,10786],{"class":1052,"line":2210},[1050,10780,8326],{"class":1191},[1050,10782,10783],{"class":1195},"1. Restore from backup if rollback fails",[1050,10785,1631],{"class":1191},[1050,10787,1273],{"class":1135},[1050,10789,10790,10792,10795,10797],{"class":1052,"line":2216},[1050,10791,8326],{"class":1191},[1050,10793,10794],{"class":1195},"2. Apply migrations forward to known good state",[1050,10796,1631],{"class":1191},[1050,10798,1273],{"class":1135},[1050,10800,10801,10803,10806,10808],{"class":1052,"line":2227},[1050,10802,8326],{"class":1191},[1050,10804,10805],{"class":1195},"3. Implement hotfix if needed",[1050,10807,1631],{"class":1191},[1050,10809,1273],{"class":1135},[1050,10811,10812,10814,10817],{"class":1052,"line":2243},[1050,10813,8326],{"class":1191},[1050,10815,10816],{"class":1195},"4. Schedule proper fix for next maintenance window",[1050,10818,2829],{"class":1191},[1050,10820,10821],{"class":1052,"line":2249},[1050,10822,8369],{"class":1135},[1050,10824,10825],{"class":1052,"line":2254},[1050,10826,1331],{"class":1169},[1050,10828,10829,10831],{"class":1052,"line":2259},[1050,10830,3307],{"class":1804},[1050,10832,10833],{"class":1169}," plan\n",[1050,10835,10836],{"class":1052,"line":2264},[1050,10837,1170],{"class":1169},[1050,10839,10840,10842],{"class":1052,"line":2282},[1050,10841,5377],{"class":1135},[1050,10843,5380],{"class":2775},[1050,10845,10846,10848,10851],{"class":1052,"line":2292},[1050,10847,2433],{"class":1127},[1050,10849,10850],{"class":1733}," monitor_rollback_progress",[1050,10852,2354],{"class":1135},[1050,10854,10855,10857,10860],{"class":1052,"line":2323},[1050,10856,2528],{"class":1155},[1050,10858,10859],{"class":1159},"Monitor rollback progress in production",[1050,10861,1163],{"class":1155},[1050,10863,10864],{"class":1052,"line":2328},[1050,10865,1331],{"class":1169},[1050,10867,10868,10870],{"class":1052,"line":2334},[1050,10869,7362],{"class":1804},[1050,10871,10872],{"class":1169}," time\n",[1050,10874,10875,10877],{"class":1052,"line":2357},[1050,10876,7362],{"class":1804},[1050,10878,10879],{"class":1169}," psutil\n",[1050,10881,10882,10884,10886,10888,10890,10892],{"class":1052,"line":2363},[1050,10883,2450],{"class":1804},[1050,10885,2453],{"class":1169},[1050,10887,1143],{"class":1135},[1050,10889,6822],{"class":1169},[1050,10891,2470],{"class":1804},[1050,10893,6827],{"class":1169},[1050,10895,10896],{"class":1052,"line":2388},[1050,10897,1331],{"class":1169},[1050,10899,10900,10903,10905],{"class":1052,"line":3933},[1050,10901,10902],{"class":1169},"        monitoring_data ",[1050,10904,1179],{"class":1135},[1050,10906,2622],{"class":1135},[1050,10908,10909,10911,10914,10916,10918,10921,10923,10926],{"class":1052,"line":3955},[1050,10910,2851],{"class":1191},[1050,10912,10913],{"class":1195},"start_time",[1050,10915,1192],{"class":1191},[1050,10917,2635],{"class":1135},[1050,10919,10920],{"class":1169}," time",[1050,10922,1143],{"class":1135},[1050,10924,10925],{"class":1250},"time",[1050,10927,2921],{"class":1135},[1050,10929,10930,10932,10935,10937,10939],{"class":1052,"line":3974},[1050,10931,2851],{"class":1191},[1050,10933,10934],{"class":1195},"checkpoints",[1050,10936,1192],{"class":1191},[1050,10938,2635],{"class":1135},[1050,10940,2876],{"class":1135},[1050,10942,10943,10945,10948,10950,10952],{"class":1052,"line":3995},[1050,10944,2851],{"class":1191},[1050,10946,10947],{"class":1195},"performance_metrics",[1050,10949,1192],{"class":1191},[1050,10951,2635],{"class":1135},[1050,10953,2876],{"class":1135},[1050,10955,10956,10958,10961,10963,10965],{"class":1052,"line":4000},[1050,10957,2851],{"class":1191},[1050,10959,10960],{"class":1195},"error_log",[1050,10962,1192],{"class":1191},[1050,10964,2635],{"class":1135},[1050,10966,2935],{"class":1135},[1050,10968,10969],{"class":1052,"line":4005},[1050,10970,2940],{"class":1135},[1050,10972,10973],{"class":1052,"line":4022},[1050,10974,1331],{"class":1169},[1050,10976,10977,10979,10982,10984,10987],{"class":1052,"line":4041},[1050,10978,6241],{"class":1127},[1050,10980,10981],{"class":1733}," log_checkpoint",[1050,10983,1136],{"class":1135},[1050,10985,10986],{"class":1739},"message",[1050,10988,1149],{"class":1135},[1050,10990,10991,10994,10996,10998,11000,11002,11004,11006],{"class":1052,"line":4060},[1050,10992,10993],{"class":1169},"            monitoring_data",[1050,10995,3028],{"class":1135},[1050,10997,1192],{"class":1191},[1050,10999,10934],{"class":1195},[1050,11001,1192],{"class":1191},[1050,11003,3037],{"class":1135},[1050,11005,3040],{"class":1250},[1050,11007,3043],{"class":1135},[1050,11009,11010,11012,11014,11016,11018,11020,11022,11024],{"class":1052,"line":4081},[1050,11011,2627],{"class":1191},[1050,11013,7385],{"class":1195},[1050,11015,1192],{"class":1191},[1050,11017,2635],{"class":1135},[1050,11019,10920],{"class":1250},[1050,11021,1143],{"class":1135},[1050,11023,10925],{"class":1250},[1050,11025,2921],{"class":1135},[1050,11027,11028,11030,11032,11034,11036,11039],{"class":1052,"line":4086},[1050,11029,2627],{"class":1191},[1050,11031,10986],{"class":1195},[1050,11033,1192],{"class":1191},[1050,11035,2635],{"class":1135},[1050,11037,11038],{"class":1250}," message",[1050,11040,1273],{"class":1135},[1050,11042,11043,11045,11048,11050,11052,11054,11056,11058,11060,11062,11065,11067,11069,11071,11073],{"class":1052,"line":4109},[1050,11044,2627],{"class":1191},[1050,11046,11047],{"class":1195},"elapsed",[1050,11049,1192],{"class":1191},[1050,11051,2635],{"class":1135},[1050,11053,10920],{"class":1250},[1050,11055,1143],{"class":1135},[1050,11057,10925],{"class":1250},[1050,11059,6847],{"class":1135},[1050,11061,8119],{"class":2592},[1050,11063,11064],{"class":1250}," monitoring_data",[1050,11066,3028],{"class":1135},[1050,11068,1192],{"class":1191},[1050,11070,10913],{"class":1195},[1050,11072,1192],{"class":1191},[1050,11074,3189],{"class":1135},[1050,11076,11077],{"class":1052,"line":4140},[1050,11078,3103],{"class":1135},[1050,11080,11081,11084,11086,11088,11091,11093,11095,11097,11099,11101,11103,11105,11107,11109,11111,11113,11115,11118,11120,11123,11125,11127,11129,11131],{"class":1052,"line":4145},[1050,11082,11083],{"class":2436},"            print",[1050,11085,1136],{"class":1135},[1050,11087,6500],{"class":1127},[1050,11089,11090],{"class":1195},"\"[",[1050,11092,2661],{"class":2660},[1050,11094,10925],{"class":1250},[1050,11096,1143],{"class":1135},[1050,11098,10925],{"class":1250},[1050,11100,6847],{"class":1135},[1050,11102,8119],{"class":2592},[1050,11104,11064],{"class":1250},[1050,11106,3028],{"class":1135},[1050,11108,1192],{"class":1191},[1050,11110,10913],{"class":1195},[1050,11112,1192],{"class":1191},[1050,11114,3149],{"class":1135},[1050,11116,11117],{"class":1127},":.1f",[1050,11119,2666],{"class":2660},[1050,11121,11122],{"class":1195},"s] ",[1050,11124,2661],{"class":2660},[1050,11126,10986],{"class":1250},[1050,11128,2666],{"class":2660},[1050,11130,1631],{"class":1195},[1050,11132,1793],{"class":1135},[1050,11134,11135],{"class":1052,"line":4162},[1050,11136,1331],{"class":1169},[1050,11138,11139,11141,11144],{"class":1052,"line":4184},[1050,11140,6241],{"class":1127},[1050,11142,11143],{"class":1733}," log_performance",[1050,11145,2354],{"class":1135},[1050,11147,11148,11150,11152,11154,11156,11158,11160,11162],{"class":1052,"line":4203},[1050,11149,10993],{"class":1169},[1050,11151,3028],{"class":1135},[1050,11153,1192],{"class":1191},[1050,11155,10947],{"class":1195},[1050,11157,1192],{"class":1191},[1050,11159,3037],{"class":1135},[1050,11161,3040],{"class":1250},[1050,11163,3043],{"class":1135},[1050,11165,11166,11168,11170,11172,11174,11176,11178,11180],{"class":1052,"line":4224},[1050,11167,2627],{"class":1191},[1050,11169,7385],{"class":1195},[1050,11171,1192],{"class":1191},[1050,11173,2635],{"class":1135},[1050,11175,10920],{"class":1250},[1050,11177,1143],{"class":1135},[1050,11179,10925],{"class":1250},[1050,11181,2921],{"class":1135},[1050,11183,11184,11186,11189,11191,11193,11196,11198,11200],{"class":1052,"line":4229},[1050,11185,2627],{"class":1191},[1050,11187,11188],{"class":1195},"cpu_percent",[1050,11190,1192],{"class":1191},[1050,11192,2635],{"class":1135},[1050,11194,11195],{"class":1250}," psutil",[1050,11197,1143],{"class":1135},[1050,11199,11188],{"class":1250},[1050,11201,2921],{"class":1135},[1050,11203,11204,11206,11209,11211,11213,11215,11217,11220,11222,11225],{"class":1052,"line":4234},[1050,11205,2627],{"class":1191},[1050,11207,11208],{"class":1195},"memory_percent",[1050,11210,1192],{"class":1191},[1050,11212,2635],{"class":1135},[1050,11214,11195],{"class":1250},[1050,11216,1143],{"class":1135},[1050,11218,11219],{"class":1250},"virtual_memory",[1050,11221,7400],{"class":1135},[1050,11223,11224],{"class":1819},"percent",[1050,11226,1273],{"class":1135},[1050,11228,11229,11231,11234,11236,11238,11240,11242,11244,11246,11249],{"class":1052,"line":4251},[1050,11230,2627],{"class":1191},[1050,11232,11233],{"class":1195},"db_connections",[1050,11235,1192],{"class":1191},[1050,11237,2635],{"class":1135},[1050,11239,10086],{"class":2436},[1050,11241,1136],{"class":1135},[1050,11243,2494],{"class":1250},[1050,11245,1143],{"class":1135},[1050,11247,11248],{"class":1819},"queries",[1050,11250,1793],{"class":1135},[1050,11252,11253],{"class":1052,"line":4270},[1050,11254,3103],{"class":1135},[1050,11256,11257],{"class":1052,"line":4290},[1050,11258,1331],{"class":1169},[1050,11260,11261,11263,11265,11267,11269,11271],{"class":1052,"line":4295},[1050,11262,3307],{"class":1804},[1050,11264,10981],{"class":1169},[1050,11266,1201],{"class":1135},[1050,11268,11143],{"class":1169},[1050,11270,1201],{"class":1135},[1050,11272,11273],{"class":1169}," monitoring_data\n",[1026,11275,11276],{},"Understanding migration reversal ensures you can safely undo database changes when needed. Proper rollback planning, data preservation strategies, and production-safe procedures are essential for maintaining system reliability and data integrity.",[11278,11279,11280],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1045,"searchDepth":1053,"depth":1060,"links":11282},[11283,11287,11291],{"id":1032,"depth":1060,"text":1033,"children":11284},[11285,11286],{"id":1037,"depth":1067,"text":1038},{"id":2399,"depth":1067,"text":2400},{"id":5340,"depth":1060,"text":5341,"children":11288},[11289,11290],{"id":5344,"depth":1067,"text":5345},{"id":7269,"depth":1067,"text":7270},{"id":9736,"depth":1060,"text":9737,"children":11292},[11293],{"id":9740,"depth":1067,"text":9741},"md",null,{},{"title":358,"description":1028},"XUrnaMXyFlDSJI1WAoYQlBlO8HAs6sToKLWRah48ezs",[11300,11302],{"title":354,"path":355,"stem":356,"description":11301,"children":-1},"Adding migrations to Django apps requires understanding the migration system's integration with app structure, handling initial migrations, and managing migrations across different app states. This section covers best practices for incorporating migrations into new and existing applications.",{"title":362,"path":363,"stem":364,"description":11303,"children":-1},"Django migrations use historical models to represent the state of your models at the time each migration was created. Understanding historical models is crucial for writing effective data migrations, debugging migration issues, and maintaining long-term project stability.",1772474924252]