[{"data":1,"prerenderedAt":19437},["ShallowReactive",2],{"navigation":3,"/microservices-with-django/monolith-to-microservices":1016,"/microservices-with-django/monolith-to-microservices-surround":19432},[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":925,"body":1018,"description":1028,"extension":19427,"links":19428,"meta":19429,"navigation":1120,"path":926,"seo":19430,"stem":927,"__hash__":19431},"docs/27.microservices-with-django/13.monolith-to-microservices.md",{"type":1019,"value":1020,"toc":19406},"minimark",[1021,1025,1029,1034,1039,1042,3932,3936,3939,6040,6044,6048,6051,7595,7599,7602,9778,9782,9785,12403,12407,12411,16478,16482,16486,17813,17817,17821,19301,19305,19308,19314,19327,19332,19343,19348,19359,19364,19375,19380,19397,19400,19403],[1022,1023,925],"h1",{"id":1024},"transforming-a-monolithic-web-app-into-a-microservice-version",[1026,1027,1028],"p",{},"Migrating from a monolithic Django application to microservices is a complex but rewarding journey. This section provides a comprehensive guide for planning, executing, and managing this transformation while maintaining system stability and business continuity.",[1030,1031,1033],"h2",{"id":1032},"assessment-and-planning","Assessment and Planning",[1035,1036,1038],"h3",{"id":1037},"_1-monolith-analysis","1. Monolith Analysis",[1026,1040,1041],{},"Before starting the migration, thoroughly analyze your existing monolithic application:",[1043,1044,1049],"pre",{"className":1045,"code":1046,"language":1047,"meta":1048,"style":1048},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# analysis_tools.py\nimport ast\nimport os\nfrom collections import defaultdict, Counter\nimport networkx as nx\n\nclass MonolithAnalyzer:\n    \"\"\"Analyze monolithic Django application structure\"\"\"\n    \n    def __init__(self, project_path):\n        self.project_path = project_path\n        self.apps = []\n        self.models = {}\n        self.views = {}\n        self.dependencies = defaultdict(set)\n        self.database_usage = defaultdict(set)\n    \n    def analyze_project(self):\n        \"\"\"Perform comprehensive project analysis\"\"\"\n        self.discover_apps()\n        self.analyze_models()\n        self.analyze_views()\n        self.analyze_dependencies()\n        self.analyze_database_usage()\n        \n        return self.generate_report()\n    \n    def discover_apps(self):\n        \"\"\"Discover Django apps in the project\"\"\"\n        for root, dirs, files in os.walk(self.project_path):\n            if 'apps.py' in files or 'models.py' in files:\n                app_name = os.path.basename(root)\n                if app_name not in ['migrations', '__pycache__']:\n                    self.apps.append(app_name)\n    \n    def analyze_models(self):\n        \"\"\"Analyze model relationships and complexity\"\"\"\n        for app in self.apps:\n            models_file = os.path.join(self.project_path, app, 'models.py')\n            if os.path.exists(models_file):\n                self.models[app] = self._parse_models(models_file)\n    \n    def analyze_views(self):\n        \"\"\"Analyze view complexity and dependencies\"\"\"\n        for app in self.apps:\n            views_file = os.path.join(self.project_path, app, 'views.py')\n            if os.path.exists(views_file):\n                self.views[app] = self._parse_views(views_file)\n    \n    def analyze_dependencies(self):\n        \"\"\"Analyze inter-app dependencies\"\"\"\n        for app in self.apps:\n            app_path = os.path.join(self.project_path, app)\n            for root, dirs, files in os.walk(app_path):\n                for file in files:\n                    if file.endswith('.py'):\n                        file_path = os.path.join(root, file)\n                        deps = self._extract_dependencies(file_path)\n                        self.dependencies[app].update(deps)\n    \n    def _parse_models(self, models_file):\n        \"\"\"Parse models from file\"\"\"\n        with open(models_file, 'r') as f:\n            content = f.read()\n        \n        try:\n            tree = ast.parse(content)\n            models = []\n            \n            for node in ast.walk(tree):\n                if isinstance(node, ast.ClassDef):\n                    # Check if it's a Django model\n                    for base in node.bases:\n                        if isinstance(base, ast.Attribute) and base.attr == 'Model':\n                            models.append({\n                                'name': node.name,\n                                'fields': self._extract_model_fields(node),\n                                'methods': [n.name for n in node.body if isinstance(n, ast.FunctionDef)]\n                            })\n            \n            return models\n        except SyntaxError:\n            return []\n    \n    def _extract_model_fields(self, class_node):\n        \"\"\"Extract model fields from class definition\"\"\"\n        fields = []\n        for node in class_node.body:\n            if isinstance(node, ast.Assign):\n                for target in node.targets:\n                    if isinstance(target, ast.Name):\n                        fields.append(target.id)\n        return fields\n    \n    def _parse_views(self, views_file):\n        \"\"\"Parse views from file\"\"\"\n        with open(views_file, 'r') as f:\n            content = f.read()\n        \n        try:\n            tree = ast.parse(content)\n            views = []\n            \n            for node in ast.walk(tree):\n                if isinstance(node, ast.FunctionDef) or isinstance(node, ast.ClassDef):\n                    views.append({\n                        'name': node.name,\n                        'type': 'function' if isinstance(node, ast.FunctionDef) else 'class',\n                        'complexity': self._calculate_complexity(node)\n                    })\n            \n            return views\n        except SyntaxError:\n            return []\n    \n    def _calculate_complexity(self, node):\n        \"\"\"Calculate cyclomatic complexity\"\"\"\n        complexity = 1\n        for child in ast.walk(node):\n            if isinstance(child, (ast.If, ast.While, ast.For, ast.Try, ast.With)):\n                complexity += 1\n        return complexity\n    \n    def _extract_dependencies(self, file_path):\n        \"\"\"Extract import dependencies from file\"\"\"\n        dependencies = set()\n        \n        try:\n            with open(file_path, 'r') as f:\n                content = f.read()\n            \n            tree = ast.parse(content)\n            \n            for node in ast.walk(tree):\n                if isinstance(node, ast.Import):\n                    for alias in node.names:\n                        dependencies.add(alias.name.split('.')[0])\n                elif isinstance(node, ast.ImportFrom):\n                    if node.module:\n                        dependencies.add(node.module.split('.')[0])\n        \n        except (SyntaxError, UnicodeDecodeError):\n            pass\n        \n        return dependencies\n    \n    def generate_report(self):\n        \"\"\"Generate analysis report\"\"\"\n        return {\n            'apps': self.apps,\n            'total_models': sum(len(models) for models in self.models.values()),\n            'total_views': sum(len(views) for views in self.views.values()),\n            'app_dependencies': dict(self.dependencies),\n            'complexity_by_app': {\n                app: sum(view['complexity'] for view in views)\n                for app, views in self.views.items()\n            },\n            'models_by_app': {\n                app: len(models) for app, models in self.models.items()\n            }\n        }\n\n# Usage\nanalyzer = MonolithAnalyzer('/path/to/django/project')\nreport = analyzer.analyze_project()\nprint(f\"Found {len(report['apps'])} apps with {report['total_models']} models\")\n","python","",[1050,1051,1052,1061,1072,1080,1101,1115,1122,1136,1150,1156,1182,1202,1217,1232,1246,1270,1290,1295,1310,1321,1334,1346,1358,1370,1382,1388,1404,1409,1423,1433,1473,1513,1541,1577,1599,1604,1618,1628,1646,1688,1711,1745,1750,1764,1774,1791,1832,1854,1884,1889,1903,1913,1930,1962,1993,2009,2033,2061,2083,2110,2115,2134,2144,2177,2194,2199,2207,2230,2240,2246,2269,2293,2299,2320,2367,2380,2403,2429,2486,2492,2497,2506,2517,2524,2529,2548,2558,2568,2585,2607,2626,2649,2670,2678,2683,2702,2712,2739,2754,2759,2766,2785,2795,2800,2821,2861,2873,2893,2941,2966,2972,2977,2985,2994,3001,3006,3024,3034,3046,3068,3132,3143,3151,3156,3175,3185,3198,3203,3210,3238,3254,3259,3278,3283,3304,3326,3345,3387,3410,3424,3459,3464,3481,3487,3492,3500,3505,3519,3529,3537,3557,3604,3647,3672,3686,3723,3749,3755,3769,3807,3813,3819,3824,3830,3851,3869],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# analysis_tools.py\n",[1053,1062,1064,1068],{"class":1055,"line":1063},2,[1053,1065,1067],{"class":1066},"siDh9","import",[1053,1069,1071],{"class":1070},"sftqT"," ast\n",[1053,1073,1075,1077],{"class":1055,"line":1074},3,[1053,1076,1067],{"class":1066},[1053,1078,1079],{"class":1070}," os\n",[1053,1081,1083,1086,1089,1091,1094,1098],{"class":1055,"line":1082},4,[1053,1084,1085],{"class":1066},"from",[1053,1087,1088],{"class":1070}," collections ",[1053,1090,1067],{"class":1066},[1053,1092,1093],{"class":1070}," defaultdict",[1053,1095,1097],{"class":1096},"soVBu",",",[1053,1099,1100],{"class":1070}," Counter\n",[1053,1102,1104,1106,1109,1112],{"class":1055,"line":1103},5,[1053,1105,1067],{"class":1066},[1053,1107,1108],{"class":1070}," networkx ",[1053,1110,1111],{"class":1066},"as",[1053,1113,1114],{"class":1070}," nx\n",[1053,1116,1118],{"class":1055,"line":1117},6,[1053,1119,1121],{"emptyLinePlaceholder":1120},true,"\n",[1053,1123,1125,1129,1133],{"class":1055,"line":1124},7,[1053,1126,1128],{"class":1127},"s5Kfy","class",[1053,1130,1132],{"class":1131},"sD-vU"," MonolithAnalyzer",[1053,1134,1135],{"class":1096},":\n",[1053,1137,1139,1143,1147],{"class":1055,"line":1138},8,[1053,1140,1142],{"class":1141},"sm7ve","    \"\"\"",[1053,1144,1146],{"class":1145},"sVyVU","Analyze monolithic Django application structure",[1053,1148,1149],{"class":1141},"\"\"\"\n",[1053,1151,1153],{"class":1055,"line":1152},9,[1053,1154,1155],{"class":1070},"    \n",[1053,1157,1159,1162,1166,1169,1173,1175,1179],{"class":1055,"line":1158},10,[1053,1160,1161],{"class":1127},"    def",[1053,1163,1165],{"class":1164},"sJdAF"," __init__",[1053,1167,1168],{"class":1096},"(",[1053,1170,1172],{"class":1171},"sRjD_","self",[1053,1174,1097],{"class":1096},[1053,1176,1178],{"class":1177},"sCyAa"," project_path",[1053,1180,1181],{"class":1096},"):\n",[1053,1183,1185,1189,1192,1196,1199],{"class":1055,"line":1184},11,[1053,1186,1188],{"class":1187},"se3Ec","        self",[1053,1190,1191],{"class":1096},".",[1053,1193,1195],{"class":1194},"sBPpx","project_path",[1053,1197,1198],{"class":1096}," =",[1053,1200,1201],{"class":1070}," project_path\n",[1053,1203,1205,1207,1209,1212,1214],{"class":1055,"line":1204},12,[1053,1206,1188],{"class":1187},[1053,1208,1191],{"class":1096},[1053,1210,1211],{"class":1194},"apps",[1053,1213,1198],{"class":1096},[1053,1215,1216],{"class":1096}," []\n",[1053,1218,1220,1222,1224,1227,1229],{"class":1055,"line":1219},13,[1053,1221,1188],{"class":1187},[1053,1223,1191],{"class":1096},[1053,1225,1226],{"class":1194},"models",[1053,1228,1198],{"class":1096},[1053,1230,1231],{"class":1096}," {}\n",[1053,1233,1235,1237,1239,1242,1244],{"class":1055,"line":1234},14,[1053,1236,1188],{"class":1187},[1053,1238,1191],{"class":1096},[1053,1240,1241],{"class":1194},"views",[1053,1243,1198],{"class":1096},[1053,1245,1231],{"class":1096},[1053,1247,1249,1251,1253,1256,1258,1261,1263,1267],{"class":1055,"line":1248},15,[1053,1250,1188],{"class":1187},[1053,1252,1191],{"class":1096},[1053,1254,1255],{"class":1194},"dependencies",[1053,1257,1198],{"class":1096},[1053,1259,1093],{"class":1260},"siWMO",[1053,1262,1168],{"class":1096},[1053,1264,1266],{"class":1265},"sa2tF","set",[1053,1268,1269],{"class":1096},")\n",[1053,1271,1273,1275,1277,1280,1282,1284,1286,1288],{"class":1055,"line":1272},16,[1053,1274,1188],{"class":1187},[1053,1276,1191],{"class":1096},[1053,1278,1279],{"class":1194},"database_usage",[1053,1281,1198],{"class":1096},[1053,1283,1093],{"class":1260},[1053,1285,1168],{"class":1096},[1053,1287,1266],{"class":1265},[1053,1289,1269],{"class":1096},[1053,1291,1293],{"class":1055,"line":1292},17,[1053,1294,1155],{"class":1070},[1053,1296,1298,1300,1304,1306,1308],{"class":1055,"line":1297},18,[1053,1299,1161],{"class":1127},[1053,1301,1303],{"class":1302},"sljsM"," analyze_project",[1053,1305,1168],{"class":1096},[1053,1307,1172],{"class":1171},[1053,1309,1181],{"class":1096},[1053,1311,1313,1316,1319],{"class":1055,"line":1312},19,[1053,1314,1315],{"class":1141},"        \"\"\"",[1053,1317,1318],{"class":1145},"Perform comprehensive project analysis",[1053,1320,1149],{"class":1141},[1053,1322,1324,1326,1328,1331],{"class":1055,"line":1323},20,[1053,1325,1188],{"class":1187},[1053,1327,1191],{"class":1096},[1053,1329,1330],{"class":1260},"discover_apps",[1053,1332,1333],{"class":1096},"()\n",[1053,1335,1337,1339,1341,1344],{"class":1055,"line":1336},21,[1053,1338,1188],{"class":1187},[1053,1340,1191],{"class":1096},[1053,1342,1343],{"class":1260},"analyze_models",[1053,1345,1333],{"class":1096},[1053,1347,1349,1351,1353,1356],{"class":1055,"line":1348},22,[1053,1350,1188],{"class":1187},[1053,1352,1191],{"class":1096},[1053,1354,1355],{"class":1260},"analyze_views",[1053,1357,1333],{"class":1096},[1053,1359,1361,1363,1365,1368],{"class":1055,"line":1360},23,[1053,1362,1188],{"class":1187},[1053,1364,1191],{"class":1096},[1053,1366,1367],{"class":1260},"analyze_dependencies",[1053,1369,1333],{"class":1096},[1053,1371,1373,1375,1377,1380],{"class":1055,"line":1372},24,[1053,1374,1188],{"class":1187},[1053,1376,1191],{"class":1096},[1053,1378,1379],{"class":1260},"analyze_database_usage",[1053,1381,1333],{"class":1096},[1053,1383,1385],{"class":1055,"line":1384},25,[1053,1386,1387],{"class":1070},"        \n",[1053,1389,1391,1394,1397,1399,1402],{"class":1055,"line":1390},26,[1053,1392,1393],{"class":1066},"        return",[1053,1395,1396],{"class":1187}," self",[1053,1398,1191],{"class":1096},[1053,1400,1401],{"class":1260},"generate_report",[1053,1403,1333],{"class":1096},[1053,1405,1407],{"class":1055,"line":1406},27,[1053,1408,1155],{"class":1070},[1053,1410,1412,1414,1417,1419,1421],{"class":1055,"line":1411},28,[1053,1413,1161],{"class":1127},[1053,1415,1416],{"class":1302}," discover_apps",[1053,1418,1168],{"class":1096},[1053,1420,1172],{"class":1171},[1053,1422,1181],{"class":1096},[1053,1424,1426,1428,1431],{"class":1055,"line":1425},29,[1053,1427,1315],{"class":1141},[1053,1429,1430],{"class":1145},"Discover Django apps in the project",[1053,1432,1149],{"class":1141},[1053,1434,1436,1439,1442,1444,1447,1449,1452,1455,1458,1460,1463,1465,1467,1469,1471],{"class":1055,"line":1435},30,[1053,1437,1438],{"class":1066},"        for",[1053,1440,1441],{"class":1070}," root",[1053,1443,1097],{"class":1096},[1053,1445,1446],{"class":1070}," dirs",[1053,1448,1097],{"class":1096},[1053,1450,1451],{"class":1070}," files ",[1053,1453,1454],{"class":1066},"in",[1053,1456,1457],{"class":1070}," os",[1053,1459,1191],{"class":1096},[1053,1461,1462],{"class":1260},"walk",[1053,1464,1168],{"class":1096},[1053,1466,1172],{"class":1187},[1053,1468,1191],{"class":1096},[1053,1470,1195],{"class":1194},[1053,1472,1181],{"class":1096},[1053,1474,1476,1479,1483,1487,1490,1494,1496,1499,1501,1504,1506,1508,1511],{"class":1055,"line":1475},31,[1053,1477,1478],{"class":1066},"            if",[1053,1480,1482],{"class":1481},"sbYkP"," '",[1053,1484,1486],{"class":1485},"sTbE_","apps.py",[1053,1488,1489],{"class":1481},"'",[1053,1491,1493],{"class":1492},"sVsLi"," in",[1053,1495,1451],{"class":1070},[1053,1497,1498],{"class":1492},"or",[1053,1500,1482],{"class":1481},[1053,1502,1503],{"class":1485},"models.py",[1053,1505,1489],{"class":1481},[1053,1507,1493],{"class":1492},[1053,1509,1510],{"class":1070}," files",[1053,1512,1135],{"class":1096},[1053,1514,1516,1519,1522,1524,1526,1529,1531,1534,1536,1539],{"class":1055,"line":1515},32,[1053,1517,1518],{"class":1070},"                app_name ",[1053,1520,1521],{"class":1096},"=",[1053,1523,1457],{"class":1070},[1053,1525,1191],{"class":1096},[1053,1527,1528],{"class":1194},"path",[1053,1530,1191],{"class":1096},[1053,1532,1533],{"class":1260},"basename",[1053,1535,1168],{"class":1096},[1053,1537,1538],{"class":1260},"root",[1053,1540,1269],{"class":1096},[1053,1542,1544,1547,1550,1553,1555,1558,1560,1563,1565,1567,1569,1572,1574],{"class":1055,"line":1543},33,[1053,1545,1546],{"class":1066},"                if",[1053,1548,1549],{"class":1070}," app_name ",[1053,1551,1552],{"class":1492},"not",[1053,1554,1493],{"class":1492},[1053,1556,1557],{"class":1096}," [",[1053,1559,1489],{"class":1481},[1053,1561,1562],{"class":1485},"migrations",[1053,1564,1489],{"class":1481},[1053,1566,1097],{"class":1096},[1053,1568,1482],{"class":1481},[1053,1570,1571],{"class":1485},"__pycache__",[1053,1573,1489],{"class":1481},[1053,1575,1576],{"class":1096},"]:\n",[1053,1578,1580,1583,1585,1587,1589,1592,1594,1597],{"class":1055,"line":1579},34,[1053,1581,1582],{"class":1187},"                    self",[1053,1584,1191],{"class":1096},[1053,1586,1211],{"class":1194},[1053,1588,1191],{"class":1096},[1053,1590,1591],{"class":1260},"append",[1053,1593,1168],{"class":1096},[1053,1595,1596],{"class":1260},"app_name",[1053,1598,1269],{"class":1096},[1053,1600,1602],{"class":1055,"line":1601},35,[1053,1603,1155],{"class":1070},[1053,1605,1607,1609,1612,1614,1616],{"class":1055,"line":1606},36,[1053,1608,1161],{"class":1127},[1053,1610,1611],{"class":1302}," analyze_models",[1053,1613,1168],{"class":1096},[1053,1615,1172],{"class":1171},[1053,1617,1181],{"class":1096},[1053,1619,1621,1623,1626],{"class":1055,"line":1620},37,[1053,1622,1315],{"class":1141},[1053,1624,1625],{"class":1145},"Analyze model relationships and complexity",[1053,1627,1149],{"class":1141},[1053,1629,1631,1633,1636,1638,1640,1642,1644],{"class":1055,"line":1630},38,[1053,1632,1438],{"class":1066},[1053,1634,1635],{"class":1070}," app ",[1053,1637,1454],{"class":1066},[1053,1639,1396],{"class":1187},[1053,1641,1191],{"class":1096},[1053,1643,1211],{"class":1194},[1053,1645,1135],{"class":1096},[1053,1647,1649,1652,1654,1656,1658,1660,1662,1665,1667,1669,1671,1673,1675,1678,1680,1682,1684,1686],{"class":1055,"line":1648},39,[1053,1650,1651],{"class":1070},"            models_file ",[1053,1653,1521],{"class":1096},[1053,1655,1457],{"class":1070},[1053,1657,1191],{"class":1096},[1053,1659,1528],{"class":1194},[1053,1661,1191],{"class":1096},[1053,1663,1664],{"class":1260},"join",[1053,1666,1168],{"class":1096},[1053,1668,1172],{"class":1187},[1053,1670,1191],{"class":1096},[1053,1672,1195],{"class":1194},[1053,1674,1097],{"class":1096},[1053,1676,1677],{"class":1260}," app",[1053,1679,1097],{"class":1096},[1053,1681,1482],{"class":1481},[1053,1683,1503],{"class":1485},[1053,1685,1489],{"class":1481},[1053,1687,1269],{"class":1096},[1053,1689,1691,1693,1695,1697,1699,1701,1704,1706,1709],{"class":1055,"line":1690},40,[1053,1692,1478],{"class":1066},[1053,1694,1457],{"class":1070},[1053,1696,1191],{"class":1096},[1053,1698,1528],{"class":1194},[1053,1700,1191],{"class":1096},[1053,1702,1703],{"class":1260},"exists",[1053,1705,1168],{"class":1096},[1053,1707,1708],{"class":1260},"models_file",[1053,1710,1181],{"class":1096},[1053,1712,1714,1717,1719,1721,1724,1727,1730,1732,1734,1736,1739,1741,1743],{"class":1055,"line":1713},41,[1053,1715,1716],{"class":1187},"                self",[1053,1718,1191],{"class":1096},[1053,1720,1226],{"class":1194},[1053,1722,1723],{"class":1096},"[",[1053,1725,1726],{"class":1194},"app",[1053,1728,1729],{"class":1096},"]",[1053,1731,1198],{"class":1096},[1053,1733,1396],{"class":1187},[1053,1735,1191],{"class":1096},[1053,1737,1738],{"class":1260},"_parse_models",[1053,1740,1168],{"class":1096},[1053,1742,1708],{"class":1260},[1053,1744,1269],{"class":1096},[1053,1746,1748],{"class":1055,"line":1747},42,[1053,1749,1155],{"class":1070},[1053,1751,1753,1755,1758,1760,1762],{"class":1055,"line":1752},43,[1053,1754,1161],{"class":1127},[1053,1756,1757],{"class":1302}," analyze_views",[1053,1759,1168],{"class":1096},[1053,1761,1172],{"class":1171},[1053,1763,1181],{"class":1096},[1053,1765,1767,1769,1772],{"class":1055,"line":1766},44,[1053,1768,1315],{"class":1141},[1053,1770,1771],{"class":1145},"Analyze view complexity and dependencies",[1053,1773,1149],{"class":1141},[1053,1775,1777,1779,1781,1783,1785,1787,1789],{"class":1055,"line":1776},45,[1053,1778,1438],{"class":1066},[1053,1780,1635],{"class":1070},[1053,1782,1454],{"class":1066},[1053,1784,1396],{"class":1187},[1053,1786,1191],{"class":1096},[1053,1788,1211],{"class":1194},[1053,1790,1135],{"class":1096},[1053,1792,1794,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1828,1830],{"class":1055,"line":1793},46,[1053,1795,1796],{"class":1070},"            views_file ",[1053,1798,1521],{"class":1096},[1053,1800,1457],{"class":1070},[1053,1802,1191],{"class":1096},[1053,1804,1528],{"class":1194},[1053,1806,1191],{"class":1096},[1053,1808,1664],{"class":1260},[1053,1810,1168],{"class":1096},[1053,1812,1172],{"class":1187},[1053,1814,1191],{"class":1096},[1053,1816,1195],{"class":1194},[1053,1818,1097],{"class":1096},[1053,1820,1677],{"class":1260},[1053,1822,1097],{"class":1096},[1053,1824,1482],{"class":1481},[1053,1826,1827],{"class":1485},"views.py",[1053,1829,1489],{"class":1481},[1053,1831,1269],{"class":1096},[1053,1833,1835,1837,1839,1841,1843,1845,1847,1849,1852],{"class":1055,"line":1834},47,[1053,1836,1478],{"class":1066},[1053,1838,1457],{"class":1070},[1053,1840,1191],{"class":1096},[1053,1842,1528],{"class":1194},[1053,1844,1191],{"class":1096},[1053,1846,1703],{"class":1260},[1053,1848,1168],{"class":1096},[1053,1850,1851],{"class":1260},"views_file",[1053,1853,1181],{"class":1096},[1053,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873,1875,1878,1880,1882],{"class":1055,"line":1856},48,[1053,1858,1716],{"class":1187},[1053,1860,1191],{"class":1096},[1053,1862,1241],{"class":1194},[1053,1864,1723],{"class":1096},[1053,1866,1726],{"class":1194},[1053,1868,1729],{"class":1096},[1053,1870,1198],{"class":1096},[1053,1872,1396],{"class":1187},[1053,1874,1191],{"class":1096},[1053,1876,1877],{"class":1260},"_parse_views",[1053,1879,1168],{"class":1096},[1053,1881,1851],{"class":1260},[1053,1883,1269],{"class":1096},[1053,1885,1887],{"class":1055,"line":1886},49,[1053,1888,1155],{"class":1070},[1053,1890,1892,1894,1897,1899,1901],{"class":1055,"line":1891},50,[1053,1893,1161],{"class":1127},[1053,1895,1896],{"class":1302}," analyze_dependencies",[1053,1898,1168],{"class":1096},[1053,1900,1172],{"class":1171},[1053,1902,1181],{"class":1096},[1053,1904,1906,1908,1911],{"class":1055,"line":1905},51,[1053,1907,1315],{"class":1141},[1053,1909,1910],{"class":1145},"Analyze inter-app dependencies",[1053,1912,1149],{"class":1141},[1053,1914,1916,1918,1920,1922,1924,1926,1928],{"class":1055,"line":1915},52,[1053,1917,1438],{"class":1066},[1053,1919,1635],{"class":1070},[1053,1921,1454],{"class":1066},[1053,1923,1396],{"class":1187},[1053,1925,1191],{"class":1096},[1053,1927,1211],{"class":1194},[1053,1929,1135],{"class":1096},[1053,1931,1933,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960],{"class":1055,"line":1932},53,[1053,1934,1935],{"class":1070},"            app_path ",[1053,1937,1521],{"class":1096},[1053,1939,1457],{"class":1070},[1053,1941,1191],{"class":1096},[1053,1943,1528],{"class":1194},[1053,1945,1191],{"class":1096},[1053,1947,1664],{"class":1260},[1053,1949,1168],{"class":1096},[1053,1951,1172],{"class":1187},[1053,1953,1191],{"class":1096},[1053,1955,1195],{"class":1194},[1053,1957,1097],{"class":1096},[1053,1959,1677],{"class":1260},[1053,1961,1269],{"class":1096},[1053,1963,1965,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1991],{"class":1055,"line":1964},54,[1053,1966,1967],{"class":1066},"            for",[1053,1969,1441],{"class":1070},[1053,1971,1097],{"class":1096},[1053,1973,1446],{"class":1070},[1053,1975,1097],{"class":1096},[1053,1977,1451],{"class":1070},[1053,1979,1454],{"class":1066},[1053,1981,1457],{"class":1070},[1053,1983,1191],{"class":1096},[1053,1985,1462],{"class":1260},[1053,1987,1168],{"class":1096},[1053,1989,1990],{"class":1260},"app_path",[1053,1992,1181],{"class":1096},[1053,1994,1996,1999,2003,2005,2007],{"class":1055,"line":1995},55,[1053,1997,1998],{"class":1066},"                for",[1053,2000,2002],{"class":2001},"sSC40"," file",[1053,2004,1493],{"class":1066},[1053,2006,1510],{"class":1070},[1053,2008,1135],{"class":1096},[1053,2010,2012,2015,2017,2019,2022,2024,2026,2029,2031],{"class":1055,"line":2011},56,[1053,2013,2014],{"class":1066},"                    if",[1053,2016,2002],{"class":2001},[1053,2018,1191],{"class":1096},[1053,2020,2021],{"class":1260},"endswith",[1053,2023,1168],{"class":1096},[1053,2025,1489],{"class":1481},[1053,2027,2028],{"class":1485},".py",[1053,2030,1489],{"class":1481},[1053,2032,1181],{"class":1096},[1053,2034,2036,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059],{"class":1055,"line":2035},57,[1053,2037,2038],{"class":1070},"                        file_path ",[1053,2040,1521],{"class":1096},[1053,2042,1457],{"class":1070},[1053,2044,1191],{"class":1096},[1053,2046,1528],{"class":1194},[1053,2048,1191],{"class":1096},[1053,2050,1664],{"class":1260},[1053,2052,1168],{"class":1096},[1053,2054,1538],{"class":1260},[1053,2056,1097],{"class":1096},[1053,2058,2002],{"class":2001},[1053,2060,1269],{"class":1096},[1053,2062,2064,2067,2069,2071,2073,2076,2078,2081],{"class":1055,"line":2063},58,[1053,2065,2066],{"class":1070},"                        deps ",[1053,2068,1521],{"class":1096},[1053,2070,1396],{"class":1187},[1053,2072,1191],{"class":1096},[1053,2074,2075],{"class":1260},"_extract_dependencies",[1053,2077,1168],{"class":1096},[1053,2079,2080],{"class":1260},"file_path",[1053,2082,1269],{"class":1096},[1053,2084,2086,2089,2091,2093,2095,2097,2100,2103,2105,2108],{"class":1055,"line":2085},59,[1053,2087,2088],{"class":1187},"                        self",[1053,2090,1191],{"class":1096},[1053,2092,1255],{"class":1194},[1053,2094,1723],{"class":1096},[1053,2096,1726],{"class":1194},[1053,2098,2099],{"class":1096},"].",[1053,2101,2102],{"class":1260},"update",[1053,2104,1168],{"class":1096},[1053,2106,2107],{"class":1260},"deps",[1053,2109,1269],{"class":1096},[1053,2111,2113],{"class":1055,"line":2112},60,[1053,2114,1155],{"class":1070},[1053,2116,2118,2120,2123,2125,2127,2129,2132],{"class":1055,"line":2117},61,[1053,2119,1161],{"class":1127},[1053,2121,2122],{"class":1302}," _parse_models",[1053,2124,1168],{"class":1096},[1053,2126,1172],{"class":1171},[1053,2128,1097],{"class":1096},[1053,2130,2131],{"class":1177}," models_file",[1053,2133,1181],{"class":1096},[1053,2135,2137,2139,2142],{"class":1055,"line":2136},62,[1053,2138,1315],{"class":1141},[1053,2140,2141],{"class":1145},"Parse models from file",[1053,2143,1149],{"class":1141},[1053,2145,2147,2150,2153,2155,2157,2159,2161,2164,2166,2169,2172,2175],{"class":1055,"line":2146},63,[1053,2148,2149],{"class":1066},"        with",[1053,2151,2152],{"class":1164}," open",[1053,2154,1168],{"class":1096},[1053,2156,1708],{"class":1260},[1053,2158,1097],{"class":1096},[1053,2160,1482],{"class":1481},[1053,2162,2163],{"class":1485},"r",[1053,2165,1489],{"class":1481},[1053,2167,2168],{"class":1096},")",[1053,2170,2171],{"class":1066}," as",[1053,2173,2174],{"class":1070}," f",[1053,2176,1135],{"class":1096},[1053,2178,2180,2183,2185,2187,2189,2192],{"class":1055,"line":2179},64,[1053,2181,2182],{"class":1070},"            content ",[1053,2184,1521],{"class":1096},[1053,2186,2174],{"class":1070},[1053,2188,1191],{"class":1096},[1053,2190,2191],{"class":1260},"read",[1053,2193,1333],{"class":1096},[1053,2195,2197],{"class":1055,"line":2196},65,[1053,2198,1387],{"class":1070},[1053,2200,2202,2205],{"class":1055,"line":2201},66,[1053,2203,2204],{"class":1066},"        try",[1053,2206,1135],{"class":1096},[1053,2208,2210,2213,2215,2218,2220,2223,2225,2228],{"class":1055,"line":2209},67,[1053,2211,2212],{"class":1070},"            tree ",[1053,2214,1521],{"class":1096},[1053,2216,2217],{"class":1070}," ast",[1053,2219,1191],{"class":1096},[1053,2221,2222],{"class":1260},"parse",[1053,2224,1168],{"class":1096},[1053,2226,2227],{"class":1260},"content",[1053,2229,1269],{"class":1096},[1053,2231,2233,2236,2238],{"class":1055,"line":2232},68,[1053,2234,2235],{"class":1070},"            models ",[1053,2237,1521],{"class":1096},[1053,2239,1216],{"class":1096},[1053,2241,2243],{"class":1055,"line":2242},69,[1053,2244,2245],{"class":1070},"            \n",[1053,2247,2249,2251,2254,2256,2258,2260,2262,2264,2267],{"class":1055,"line":2248},70,[1053,2250,1967],{"class":1066},[1053,2252,2253],{"class":1070}," node ",[1053,2255,1454],{"class":1066},[1053,2257,2217],{"class":1070},[1053,2259,1191],{"class":1096},[1053,2261,1462],{"class":1260},[1053,2263,1168],{"class":1096},[1053,2265,2266],{"class":1260},"tree",[1053,2268,1181],{"class":1096},[1053,2270,2272,2274,2277,2279,2282,2284,2286,2288,2291],{"class":1055,"line":2271},71,[1053,2273,1546],{"class":1066},[1053,2275,2276],{"class":1164}," isinstance",[1053,2278,1168],{"class":1096},[1053,2280,2281],{"class":1260},"node",[1053,2283,1097],{"class":1096},[1053,2285,2217],{"class":1260},[1053,2287,1191],{"class":1096},[1053,2289,2290],{"class":1194},"ClassDef",[1053,2292,1181],{"class":1096},[1053,2294,2296],{"class":1055,"line":2295},72,[1053,2297,2298],{"class":1059},"                    # Check if it's a Django model\n",[1053,2300,2302,2305,2308,2310,2313,2315,2318],{"class":1055,"line":2301},73,[1053,2303,2304],{"class":1066},"                    for",[1053,2306,2307],{"class":1070}," base ",[1053,2309,1454],{"class":1066},[1053,2311,2312],{"class":1070}," node",[1053,2314,1191],{"class":1096},[1053,2316,2317],{"class":1194},"bases",[1053,2319,1135],{"class":1096},[1053,2321,2323,2326,2328,2330,2333,2335,2337,2339,2342,2344,2347,2350,2352,2355,2358,2360,2363,2365],{"class":1055,"line":2322},74,[1053,2324,2325],{"class":1066},"                        if",[1053,2327,2276],{"class":1164},[1053,2329,1168],{"class":1096},[1053,2331,2332],{"class":1260},"base",[1053,2334,1097],{"class":1096},[1053,2336,2217],{"class":1260},[1053,2338,1191],{"class":1096},[1053,2340,2341],{"class":1194},"Attribute",[1053,2343,2168],{"class":1096},[1053,2345,2346],{"class":1492}," and",[1053,2348,2349],{"class":1070}," base",[1053,2351,1191],{"class":1096},[1053,2353,2354],{"class":1194},"attr",[1053,2356,2357],{"class":1492}," ==",[1053,2359,1482],{"class":1481},[1053,2361,2362],{"class":1485},"Model",[1053,2364,1489],{"class":1481},[1053,2366,1135],{"class":1096},[1053,2368,2370,2373,2375,2377],{"class":1055,"line":2369},75,[1053,2371,2372],{"class":1070},"                            models",[1053,2374,1191],{"class":1096},[1053,2376,1591],{"class":1260},[1053,2378,2379],{"class":1096},"({\n",[1053,2381,2383,2386,2389,2391,2394,2396,2398,2400],{"class":1055,"line":2382},76,[1053,2384,2385],{"class":1481},"                                '",[1053,2387,2388],{"class":1485},"name",[1053,2390,1489],{"class":1481},[1053,2392,2393],{"class":1096},":",[1053,2395,2312],{"class":1260},[1053,2397,1191],{"class":1096},[1053,2399,2388],{"class":1194},[1053,2401,2402],{"class":1096},",\n",[1053,2404,2406,2408,2411,2413,2415,2417,2419,2422,2424,2426],{"class":1055,"line":2405},77,[1053,2407,2385],{"class":1481},[1053,2409,2410],{"class":1485},"fields",[1053,2412,1489],{"class":1481},[1053,2414,2393],{"class":1096},[1053,2416,1396],{"class":1187},[1053,2418,1191],{"class":1096},[1053,2420,2421],{"class":1260},"_extract_model_fields",[1053,2423,1168],{"class":1096},[1053,2425,2281],{"class":1260},[1053,2427,2428],{"class":1096},"),\n",[1053,2430,2432,2434,2437,2439,2441,2443,2446,2448,2450,2453,2456,2458,2460,2462,2465,2468,2470,2472,2474,2476,2478,2480,2483],{"class":1055,"line":2431},78,[1053,2433,2385],{"class":1481},[1053,2435,2436],{"class":1485},"methods",[1053,2438,1489],{"class":1481},[1053,2440,2393],{"class":1096},[1053,2442,1557],{"class":1096},[1053,2444,2445],{"class":1260},"n",[1053,2447,1191],{"class":1096},[1053,2449,2388],{"class":1194},[1053,2451,2452],{"class":1066}," for",[1053,2454,2455],{"class":1260}," n ",[1053,2457,1454],{"class":1066},[1053,2459,2312],{"class":1260},[1053,2461,1191],{"class":1096},[1053,2463,2464],{"class":1194},"body",[1053,2466,2467],{"class":1066}," if",[1053,2469,2276],{"class":1164},[1053,2471,1168],{"class":1096},[1053,2473,2445],{"class":1260},[1053,2475,1097],{"class":1096},[1053,2477,2217],{"class":1260},[1053,2479,1191],{"class":1096},[1053,2481,2482],{"class":1194},"FunctionDef",[1053,2484,2485],{"class":1096},")]\n",[1053,2487,2489],{"class":1055,"line":2488},79,[1053,2490,2491],{"class":1096},"                            })\n",[1053,2493,2495],{"class":1055,"line":2494},80,[1053,2496,2245],{"class":1070},[1053,2498,2500,2503],{"class":1055,"line":2499},81,[1053,2501,2502],{"class":1066},"            return",[1053,2504,2505],{"class":1070}," models\n",[1053,2507,2509,2512,2515],{"class":1055,"line":2508},82,[1053,2510,2511],{"class":1066},"        except",[1053,2513,2514],{"class":1265}," SyntaxError",[1053,2516,1135],{"class":1096},[1053,2518,2520,2522],{"class":1055,"line":2519},83,[1053,2521,2502],{"class":1066},[1053,2523,1216],{"class":1096},[1053,2525,2527],{"class":1055,"line":2526},84,[1053,2528,1155],{"class":1070},[1053,2530,2532,2534,2537,2539,2541,2543,2546],{"class":1055,"line":2531},85,[1053,2533,1161],{"class":1127},[1053,2535,2536],{"class":1302}," _extract_model_fields",[1053,2538,1168],{"class":1096},[1053,2540,1172],{"class":1171},[1053,2542,1097],{"class":1096},[1053,2544,2545],{"class":1177}," class_node",[1053,2547,1181],{"class":1096},[1053,2549,2551,2553,2556],{"class":1055,"line":2550},86,[1053,2552,1315],{"class":1141},[1053,2554,2555],{"class":1145},"Extract model fields from class definition",[1053,2557,1149],{"class":1141},[1053,2559,2561,2564,2566],{"class":1055,"line":2560},87,[1053,2562,2563],{"class":1070},"        fields ",[1053,2565,1521],{"class":1096},[1053,2567,1216],{"class":1096},[1053,2569,2571,2573,2575,2577,2579,2581,2583],{"class":1055,"line":2570},88,[1053,2572,1438],{"class":1066},[1053,2574,2253],{"class":1070},[1053,2576,1454],{"class":1066},[1053,2578,2545],{"class":1070},[1053,2580,1191],{"class":1096},[1053,2582,2464],{"class":1194},[1053,2584,1135],{"class":1096},[1053,2586,2588,2590,2592,2594,2596,2598,2600,2602,2605],{"class":1055,"line":2587},89,[1053,2589,1478],{"class":1066},[1053,2591,2276],{"class":1164},[1053,2593,1168],{"class":1096},[1053,2595,2281],{"class":1260},[1053,2597,1097],{"class":1096},[1053,2599,2217],{"class":1260},[1053,2601,1191],{"class":1096},[1053,2603,2604],{"class":1194},"Assign",[1053,2606,1181],{"class":1096},[1053,2608,2610,2612,2615,2617,2619,2621,2624],{"class":1055,"line":2609},90,[1053,2611,1998],{"class":1066},[1053,2613,2614],{"class":1070}," target ",[1053,2616,1454],{"class":1066},[1053,2618,2312],{"class":1070},[1053,2620,1191],{"class":1096},[1053,2622,2623],{"class":1194},"targets",[1053,2625,1135],{"class":1096},[1053,2627,2629,2631,2633,2635,2638,2640,2642,2644,2647],{"class":1055,"line":2628},91,[1053,2630,2014],{"class":1066},[1053,2632,2276],{"class":1164},[1053,2634,1168],{"class":1096},[1053,2636,2637],{"class":1260},"target",[1053,2639,1097],{"class":1096},[1053,2641,2217],{"class":1260},[1053,2643,1191],{"class":1096},[1053,2645,2646],{"class":1194},"Name",[1053,2648,1181],{"class":1096},[1053,2650,2652,2655,2657,2659,2661,2663,2665,2668],{"class":1055,"line":2651},92,[1053,2653,2654],{"class":1070},"                        fields",[1053,2656,1191],{"class":1096},[1053,2658,1591],{"class":1260},[1053,2660,1168],{"class":1096},[1053,2662,2637],{"class":1260},[1053,2664,1191],{"class":1096},[1053,2666,2667],{"class":1194},"id",[1053,2669,1269],{"class":1096},[1053,2671,2673,2675],{"class":1055,"line":2672},93,[1053,2674,1393],{"class":1066},[1053,2676,2677],{"class":1070}," fields\n",[1053,2679,2681],{"class":1055,"line":2680},94,[1053,2682,1155],{"class":1070},[1053,2684,2686,2688,2691,2693,2695,2697,2700],{"class":1055,"line":2685},95,[1053,2687,1161],{"class":1127},[1053,2689,2690],{"class":1302}," _parse_views",[1053,2692,1168],{"class":1096},[1053,2694,1172],{"class":1171},[1053,2696,1097],{"class":1096},[1053,2698,2699],{"class":1177}," views_file",[1053,2701,1181],{"class":1096},[1053,2703,2705,2707,2710],{"class":1055,"line":2704},96,[1053,2706,1315],{"class":1141},[1053,2708,2709],{"class":1145},"Parse views from file",[1053,2711,1149],{"class":1141},[1053,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737],{"class":1055,"line":2714},97,[1053,2716,2149],{"class":1066},[1053,2718,2152],{"class":1164},[1053,2720,1168],{"class":1096},[1053,2722,1851],{"class":1260},[1053,2724,1097],{"class":1096},[1053,2726,1482],{"class":1481},[1053,2728,2163],{"class":1485},[1053,2730,1489],{"class":1481},[1053,2732,2168],{"class":1096},[1053,2734,2171],{"class":1066},[1053,2736,2174],{"class":1070},[1053,2738,1135],{"class":1096},[1053,2740,2742,2744,2746,2748,2750,2752],{"class":1055,"line":2741},98,[1053,2743,2182],{"class":1070},[1053,2745,1521],{"class":1096},[1053,2747,2174],{"class":1070},[1053,2749,1191],{"class":1096},[1053,2751,2191],{"class":1260},[1053,2753,1333],{"class":1096},[1053,2755,2757],{"class":1055,"line":2756},99,[1053,2758,1387],{"class":1070},[1053,2760,2762,2764],{"class":1055,"line":2761},100,[1053,2763,2204],{"class":1066},[1053,2765,1135],{"class":1096},[1053,2767,2769,2771,2773,2775,2777,2779,2781,2783],{"class":1055,"line":2768},101,[1053,2770,2212],{"class":1070},[1053,2772,1521],{"class":1096},[1053,2774,2217],{"class":1070},[1053,2776,1191],{"class":1096},[1053,2778,2222],{"class":1260},[1053,2780,1168],{"class":1096},[1053,2782,2227],{"class":1260},[1053,2784,1269],{"class":1096},[1053,2786,2788,2791,2793],{"class":1055,"line":2787},102,[1053,2789,2790],{"class":1070},"            views ",[1053,2792,1521],{"class":1096},[1053,2794,1216],{"class":1096},[1053,2796,2798],{"class":1055,"line":2797},103,[1053,2799,2245],{"class":1070},[1053,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819],{"class":1055,"line":2802},104,[1053,2804,1967],{"class":1066},[1053,2806,2253],{"class":1070},[1053,2808,1454],{"class":1066},[1053,2810,2217],{"class":1070},[1053,2812,1191],{"class":1096},[1053,2814,1462],{"class":1260},[1053,2816,1168],{"class":1096},[1053,2818,2266],{"class":1260},[1053,2820,1181],{"class":1096},[1053,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2845,2847,2849,2851,2853,2855,2857,2859],{"class":1055,"line":2823},105,[1053,2825,1546],{"class":1066},[1053,2827,2276],{"class":1164},[1053,2829,1168],{"class":1096},[1053,2831,2281],{"class":1260},[1053,2833,1097],{"class":1096},[1053,2835,2217],{"class":1260},[1053,2837,1191],{"class":1096},[1053,2839,2482],{"class":1194},[1053,2841,2168],{"class":1096},[1053,2843,2844],{"class":1492}," or",[1053,2846,2276],{"class":1164},[1053,2848,1168],{"class":1096},[1053,2850,2281],{"class":1260},[1053,2852,1097],{"class":1096},[1053,2854,2217],{"class":1260},[1053,2856,1191],{"class":1096},[1053,2858,2290],{"class":1194},[1053,2860,1181],{"class":1096},[1053,2862,2864,2867,2869,2871],{"class":1055,"line":2863},106,[1053,2865,2866],{"class":1070},"                    views",[1053,2868,1191],{"class":1096},[1053,2870,1591],{"class":1260},[1053,2872,2379],{"class":1096},[1053,2874,2876,2879,2881,2883,2885,2887,2889,2891],{"class":1055,"line":2875},107,[1053,2877,2878],{"class":1481},"                        '",[1053,2880,2388],{"class":1485},[1053,2882,1489],{"class":1481},[1053,2884,2393],{"class":1096},[1053,2886,2312],{"class":1260},[1053,2888,1191],{"class":1096},[1053,2890,2388],{"class":1194},[1053,2892,2402],{"class":1096},[1053,2894,2896,2898,2901,2903,2905,2907,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930,2933,2935,2937,2939],{"class":1055,"line":2895},108,[1053,2897,2878],{"class":1481},[1053,2899,2900],{"class":1485},"type",[1053,2902,1489],{"class":1481},[1053,2904,2393],{"class":1096},[1053,2906,1482],{"class":1481},[1053,2908,2909],{"class":1485},"function",[1053,2911,1489],{"class":1481},[1053,2913,2467],{"class":1066},[1053,2915,2276],{"class":1164},[1053,2917,1168],{"class":1096},[1053,2919,2281],{"class":1260},[1053,2921,1097],{"class":1096},[1053,2923,2217],{"class":1260},[1053,2925,1191],{"class":1096},[1053,2927,2482],{"class":1194},[1053,2929,2168],{"class":1096},[1053,2931,2932],{"class":1066}," else",[1053,2934,1482],{"class":1481},[1053,2936,1128],{"class":1485},[1053,2938,1489],{"class":1481},[1053,2940,2402],{"class":1096},[1053,2942,2944,2946,2949,2951,2953,2955,2957,2960,2962,2964],{"class":1055,"line":2943},109,[1053,2945,2878],{"class":1481},[1053,2947,2948],{"class":1485},"complexity",[1053,2950,1489],{"class":1481},[1053,2952,2393],{"class":1096},[1053,2954,1396],{"class":1187},[1053,2956,1191],{"class":1096},[1053,2958,2959],{"class":1260},"_calculate_complexity",[1053,2961,1168],{"class":1096},[1053,2963,2281],{"class":1260},[1053,2965,1269],{"class":1096},[1053,2967,2969],{"class":1055,"line":2968},110,[1053,2970,2971],{"class":1096},"                    })\n",[1053,2973,2975],{"class":1055,"line":2974},111,[1053,2976,2245],{"class":1070},[1053,2978,2980,2982],{"class":1055,"line":2979},112,[1053,2981,2502],{"class":1066},[1053,2983,2984],{"class":1070}," views\n",[1053,2986,2988,2990,2992],{"class":1055,"line":2987},113,[1053,2989,2511],{"class":1066},[1053,2991,2514],{"class":1265},[1053,2993,1135],{"class":1096},[1053,2995,2997,2999],{"class":1055,"line":2996},114,[1053,2998,2502],{"class":1066},[1053,3000,1216],{"class":1096},[1053,3002,3004],{"class":1055,"line":3003},115,[1053,3005,1155],{"class":1070},[1053,3007,3009,3011,3014,3016,3018,3020,3022],{"class":1055,"line":3008},116,[1053,3010,1161],{"class":1127},[1053,3012,3013],{"class":1302}," _calculate_complexity",[1053,3015,1168],{"class":1096},[1053,3017,1172],{"class":1171},[1053,3019,1097],{"class":1096},[1053,3021,2312],{"class":1177},[1053,3023,1181],{"class":1096},[1053,3025,3027,3029,3032],{"class":1055,"line":3026},117,[1053,3028,1315],{"class":1141},[1053,3030,3031],{"class":1145},"Calculate cyclomatic complexity",[1053,3033,1149],{"class":1141},[1053,3035,3037,3040,3042],{"class":1055,"line":3036},118,[1053,3038,3039],{"class":1070},"        complexity ",[1053,3041,1521],{"class":1096},[1053,3043,3045],{"class":3044},"s7CZa"," 1\n",[1053,3047,3049,3051,3054,3056,3058,3060,3062,3064,3066],{"class":1055,"line":3048},119,[1053,3050,1438],{"class":1066},[1053,3052,3053],{"class":1070}," child ",[1053,3055,1454],{"class":1066},[1053,3057,2217],{"class":1070},[1053,3059,1191],{"class":1096},[1053,3061,1462],{"class":1260},[1053,3063,1168],{"class":1096},[1053,3065,2281],{"class":1260},[1053,3067,1181],{"class":1096},[1053,3069,3071,3073,3075,3077,3080,3082,3085,3088,3090,3093,3095,3097,3099,3102,3104,3106,3108,3111,3113,3115,3117,3120,3122,3124,3126,3129],{"class":1055,"line":3070},120,[1053,3072,1478],{"class":1066},[1053,3074,2276],{"class":1164},[1053,3076,1168],{"class":1096},[1053,3078,3079],{"class":1260},"child",[1053,3081,1097],{"class":1096},[1053,3083,3084],{"class":1096}," (",[1053,3086,3087],{"class":1260},"ast",[1053,3089,1191],{"class":1096},[1053,3091,3092],{"class":1194},"If",[1053,3094,1097],{"class":1096},[1053,3096,2217],{"class":1260},[1053,3098,1191],{"class":1096},[1053,3100,3101],{"class":1194},"While",[1053,3103,1097],{"class":1096},[1053,3105,2217],{"class":1260},[1053,3107,1191],{"class":1096},[1053,3109,3110],{"class":1194},"For",[1053,3112,1097],{"class":1096},[1053,3114,2217],{"class":1260},[1053,3116,1191],{"class":1096},[1053,3118,3119],{"class":1194},"Try",[1053,3121,1097],{"class":1096},[1053,3123,2217],{"class":1260},[1053,3125,1191],{"class":1096},[1053,3127,3128],{"class":1194},"With",[1053,3130,3131],{"class":1096},")):\n",[1053,3133,3135,3138,3141],{"class":1055,"line":3134},121,[1053,3136,3137],{"class":1070},"                complexity ",[1053,3139,3140],{"class":1096},"+=",[1053,3142,3045],{"class":3044},[1053,3144,3146,3148],{"class":1055,"line":3145},122,[1053,3147,1393],{"class":1066},[1053,3149,3150],{"class":1070}," complexity\n",[1053,3152,3154],{"class":1055,"line":3153},123,[1053,3155,1155],{"class":1070},[1053,3157,3159,3161,3164,3166,3168,3170,3173],{"class":1055,"line":3158},124,[1053,3160,1161],{"class":1127},[1053,3162,3163],{"class":1302}," _extract_dependencies",[1053,3165,1168],{"class":1096},[1053,3167,1172],{"class":1171},[1053,3169,1097],{"class":1096},[1053,3171,3172],{"class":1177}," file_path",[1053,3174,1181],{"class":1096},[1053,3176,3178,3180,3183],{"class":1055,"line":3177},125,[1053,3179,1315],{"class":1141},[1053,3181,3182],{"class":1145},"Extract import dependencies from file",[1053,3184,1149],{"class":1141},[1053,3186,3188,3191,3193,3196],{"class":1055,"line":3187},126,[1053,3189,3190],{"class":1070},"        dependencies ",[1053,3192,1521],{"class":1096},[1053,3194,3195],{"class":1265}," set",[1053,3197,1333],{"class":1096},[1053,3199,3201],{"class":1055,"line":3200},127,[1053,3202,1387],{"class":1070},[1053,3204,3206,3208],{"class":1055,"line":3205},128,[1053,3207,2204],{"class":1066},[1053,3209,1135],{"class":1096},[1053,3211,3213,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236],{"class":1055,"line":3212},129,[1053,3214,3215],{"class":1066},"            with",[1053,3217,2152],{"class":1164},[1053,3219,1168],{"class":1096},[1053,3221,2080],{"class":1260},[1053,3223,1097],{"class":1096},[1053,3225,1482],{"class":1481},[1053,3227,2163],{"class":1485},[1053,3229,1489],{"class":1481},[1053,3231,2168],{"class":1096},[1053,3233,2171],{"class":1066},[1053,3235,2174],{"class":1070},[1053,3237,1135],{"class":1096},[1053,3239,3241,3244,3246,3248,3250,3252],{"class":1055,"line":3240},130,[1053,3242,3243],{"class":1070},"                content ",[1053,3245,1521],{"class":1096},[1053,3247,2174],{"class":1070},[1053,3249,1191],{"class":1096},[1053,3251,2191],{"class":1260},[1053,3253,1333],{"class":1096},[1053,3255,3257],{"class":1055,"line":3256},131,[1053,3258,2245],{"class":1070},[1053,3260,3262,3264,3266,3268,3270,3272,3274,3276],{"class":1055,"line":3261},132,[1053,3263,2212],{"class":1070},[1053,3265,1521],{"class":1096},[1053,3267,2217],{"class":1070},[1053,3269,1191],{"class":1096},[1053,3271,2222],{"class":1260},[1053,3273,1168],{"class":1096},[1053,3275,2227],{"class":1260},[1053,3277,1269],{"class":1096},[1053,3279,3281],{"class":1055,"line":3280},133,[1053,3282,2245],{"class":1070},[1053,3284,3286,3288,3290,3292,3294,3296,3298,3300,3302],{"class":1055,"line":3285},134,[1053,3287,1967],{"class":1066},[1053,3289,2253],{"class":1070},[1053,3291,1454],{"class":1066},[1053,3293,2217],{"class":1070},[1053,3295,1191],{"class":1096},[1053,3297,1462],{"class":1260},[1053,3299,1168],{"class":1096},[1053,3301,2266],{"class":1260},[1053,3303,1181],{"class":1096},[1053,3305,3307,3309,3311,3313,3315,3317,3319,3321,3324],{"class":1055,"line":3306},135,[1053,3308,1546],{"class":1066},[1053,3310,2276],{"class":1164},[1053,3312,1168],{"class":1096},[1053,3314,2281],{"class":1260},[1053,3316,1097],{"class":1096},[1053,3318,2217],{"class":1260},[1053,3320,1191],{"class":1096},[1053,3322,3323],{"class":1194},"Import",[1053,3325,1181],{"class":1096},[1053,3327,3329,3331,3334,3336,3338,3340,3343],{"class":1055,"line":3328},136,[1053,3330,2304],{"class":1066},[1053,3332,3333],{"class":1070}," alias ",[1053,3335,1454],{"class":1066},[1053,3337,2312],{"class":1070},[1053,3339,1191],{"class":1096},[1053,3341,3342],{"class":1194},"names",[1053,3344,1135],{"class":1096},[1053,3346,3348,3351,3353,3356,3358,3361,3363,3365,3367,3370,3372,3374,3376,3378,3381,3384],{"class":1055,"line":3347},137,[1053,3349,3350],{"class":1070},"                        dependencies",[1053,3352,1191],{"class":1096},[1053,3354,3355],{"class":1260},"add",[1053,3357,1168],{"class":1096},[1053,3359,3360],{"class":1260},"alias",[1053,3362,1191],{"class":1096},[1053,3364,2388],{"class":1194},[1053,3366,1191],{"class":1096},[1053,3368,3369],{"class":1260},"split",[1053,3371,1168],{"class":1096},[1053,3373,1489],{"class":1481},[1053,3375,1191],{"class":1485},[1053,3377,1489],{"class":1481},[1053,3379,3380],{"class":1096},")[",[1053,3382,3383],{"class":3044},"0",[1053,3385,3386],{"class":1096},"])\n",[1053,3388,3390,3393,3395,3397,3399,3401,3403,3405,3408],{"class":1055,"line":3389},138,[1053,3391,3392],{"class":1066},"                elif",[1053,3394,2276],{"class":1164},[1053,3396,1168],{"class":1096},[1053,3398,2281],{"class":1260},[1053,3400,1097],{"class":1096},[1053,3402,2217],{"class":1260},[1053,3404,1191],{"class":1096},[1053,3406,3407],{"class":1194},"ImportFrom",[1053,3409,1181],{"class":1096},[1053,3411,3413,3415,3417,3419,3422],{"class":1055,"line":3412},139,[1053,3414,2014],{"class":1066},[1053,3416,2312],{"class":1070},[1053,3418,1191],{"class":1096},[1053,3420,3421],{"class":1194},"module",[1053,3423,1135],{"class":1096},[1053,3425,3427,3429,3431,3433,3435,3437,3439,3441,3443,3445,3447,3449,3451,3453,3455,3457],{"class":1055,"line":3426},140,[1053,3428,3350],{"class":1070},[1053,3430,1191],{"class":1096},[1053,3432,3355],{"class":1260},[1053,3434,1168],{"class":1096},[1053,3436,2281],{"class":1260},[1053,3438,1191],{"class":1096},[1053,3440,3421],{"class":1194},[1053,3442,1191],{"class":1096},[1053,3444,3369],{"class":1260},[1053,3446,1168],{"class":1096},[1053,3448,1489],{"class":1481},[1053,3450,1191],{"class":1485},[1053,3452,1489],{"class":1481},[1053,3454,3380],{"class":1096},[1053,3456,3383],{"class":3044},[1053,3458,3386],{"class":1096},[1053,3460,3462],{"class":1055,"line":3461},141,[1053,3463,1387],{"class":1070},[1053,3465,3467,3469,3471,3474,3476,3479],{"class":1055,"line":3466},142,[1053,3468,2511],{"class":1066},[1053,3470,3084],{"class":1096},[1053,3472,3473],{"class":1265},"SyntaxError",[1053,3475,1097],{"class":1096},[1053,3477,3478],{"class":1265}," UnicodeDecodeError",[1053,3480,1181],{"class":1096},[1053,3482,3484],{"class":1055,"line":3483},143,[1053,3485,3486],{"class":1066},"            pass\n",[1053,3488,3490],{"class":1055,"line":3489},144,[1053,3491,1387],{"class":1070},[1053,3493,3495,3497],{"class":1055,"line":3494},145,[1053,3496,1393],{"class":1066},[1053,3498,3499],{"class":1070}," dependencies\n",[1053,3501,3503],{"class":1055,"line":3502},146,[1053,3504,1155],{"class":1070},[1053,3506,3508,3510,3513,3515,3517],{"class":1055,"line":3507},147,[1053,3509,1161],{"class":1127},[1053,3511,3512],{"class":1302}," generate_report",[1053,3514,1168],{"class":1096},[1053,3516,1172],{"class":1171},[1053,3518,1181],{"class":1096},[1053,3520,3522,3524,3527],{"class":1055,"line":3521},148,[1053,3523,1315],{"class":1141},[1053,3525,3526],{"class":1145},"Generate analysis report",[1053,3528,1149],{"class":1141},[1053,3530,3532,3534],{"class":1055,"line":3531},149,[1053,3533,1393],{"class":1066},[1053,3535,3536],{"class":1096}," {\n",[1053,3538,3540,3543,3545,3547,3549,3551,3553,3555],{"class":1055,"line":3539},150,[1053,3541,3542],{"class":1481},"            '",[1053,3544,1211],{"class":1485},[1053,3546,1489],{"class":1481},[1053,3548,2393],{"class":1096},[1053,3550,1396],{"class":1187},[1053,3552,1191],{"class":1096},[1053,3554,1211],{"class":1194},[1053,3556,2402],{"class":1096},[1053,3558,3560,3562,3565,3567,3569,3572,3574,3577,3579,3581,3583,3585,3588,3590,3592,3594,3596,3598,3601],{"class":1055,"line":3559},151,[1053,3561,3542],{"class":1481},[1053,3563,3564],{"class":1485},"total_models",[1053,3566,1489],{"class":1481},[1053,3568,2393],{"class":1096},[1053,3570,3571],{"class":1164}," sum",[1053,3573,1168],{"class":1096},[1053,3575,3576],{"class":1164},"len",[1053,3578,1168],{"class":1096},[1053,3580,1226],{"class":1260},[1053,3582,2168],{"class":1096},[1053,3584,2452],{"class":1066},[1053,3586,3587],{"class":1260}," models ",[1053,3589,1454],{"class":1066},[1053,3591,1396],{"class":1187},[1053,3593,1191],{"class":1096},[1053,3595,1226],{"class":1194},[1053,3597,1191],{"class":1096},[1053,3599,3600],{"class":1260},"values",[1053,3602,3603],{"class":1096},"()),\n",[1053,3605,3607,3609,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3633,3635,3637,3639,3641,3643,3645],{"class":1055,"line":3606},152,[1053,3608,3542],{"class":1481},[1053,3610,3611],{"class":1485},"total_views",[1053,3613,1489],{"class":1481},[1053,3615,2393],{"class":1096},[1053,3617,3571],{"class":1164},[1053,3619,1168],{"class":1096},[1053,3621,3576],{"class":1164},[1053,3623,1168],{"class":1096},[1053,3625,1241],{"class":1260},[1053,3627,2168],{"class":1096},[1053,3629,2452],{"class":1066},[1053,3631,3632],{"class":1260}," views ",[1053,3634,1454],{"class":1066},[1053,3636,1396],{"class":1187},[1053,3638,1191],{"class":1096},[1053,3640,1241],{"class":1194},[1053,3642,1191],{"class":1096},[1053,3644,3600],{"class":1260},[1053,3646,3603],{"class":1096},[1053,3648,3650,3652,3655,3657,3659,3662,3664,3666,3668,3670],{"class":1055,"line":3649},153,[1053,3651,3542],{"class":1481},[1053,3653,3654],{"class":1485},"app_dependencies",[1053,3656,1489],{"class":1481},[1053,3658,2393],{"class":1096},[1053,3660,3661],{"class":1265}," dict",[1053,3663,1168],{"class":1096},[1053,3665,1172],{"class":1187},[1053,3667,1191],{"class":1096},[1053,3669,1255],{"class":1194},[1053,3671,2428],{"class":1096},[1053,3673,3675,3677,3680,3682,3684],{"class":1055,"line":3674},154,[1053,3676,3542],{"class":1481},[1053,3678,3679],{"class":1485},"complexity_by_app",[1053,3681,1489],{"class":1481},[1053,3683,2393],{"class":1096},[1053,3685,3536],{"class":1096},[1053,3687,3689,3692,3694,3696,3698,3701,3703,3705,3707,3709,3711,3713,3716,3718,3721],{"class":1055,"line":3688},155,[1053,3690,3691],{"class":1070},"                app",[1053,3693,2393],{"class":1096},[1053,3695,3571],{"class":1164},[1053,3697,1168],{"class":1096},[1053,3699,3700],{"class":1260},"view",[1053,3702,1723],{"class":1096},[1053,3704,1489],{"class":1481},[1053,3706,2948],{"class":1485},[1053,3708,1489],{"class":1481},[1053,3710,1729],{"class":1096},[1053,3712,2452],{"class":1066},[1053,3714,3715],{"class":1260}," view ",[1053,3717,1454],{"class":1066},[1053,3719,3720],{"class":1260}," views",[1053,3722,1269],{"class":1096},[1053,3724,3726,3728,3730,3732,3734,3736,3738,3740,3742,3744,3747],{"class":1055,"line":3725},156,[1053,3727,1998],{"class":1066},[1053,3729,1677],{"class":1070},[1053,3731,1097],{"class":1096},[1053,3733,3632],{"class":1070},[1053,3735,1454],{"class":1066},[1053,3737,1396],{"class":1187},[1053,3739,1191],{"class":1096},[1053,3741,1241],{"class":1194},[1053,3743,1191],{"class":1096},[1053,3745,3746],{"class":1260},"items",[1053,3748,1333],{"class":1096},[1053,3750,3752],{"class":1055,"line":3751},157,[1053,3753,3754],{"class":1096},"            },\n",[1053,3756,3758,3760,3763,3765,3767],{"class":1055,"line":3757},158,[1053,3759,3542],{"class":1481},[1053,3761,3762],{"class":1485},"models_by_app",[1053,3764,1489],{"class":1481},[1053,3766,2393],{"class":1096},[1053,3768,3536],{"class":1096},[1053,3770,3772,3774,3776,3779,3781,3783,3785,3787,3789,3791,3793,3795,3797,3799,3801,3803,3805],{"class":1055,"line":3771},159,[1053,3773,3691],{"class":1070},[1053,3775,2393],{"class":1096},[1053,3777,3778],{"class":1164}," len",[1053,3780,1168],{"class":1096},[1053,3782,1226],{"class":1260},[1053,3784,2168],{"class":1096},[1053,3786,2452],{"class":1066},[1053,3788,1677],{"class":1070},[1053,3790,1097],{"class":1096},[1053,3792,3587],{"class":1070},[1053,3794,1454],{"class":1066},[1053,3796,1396],{"class":1187},[1053,3798,1191],{"class":1096},[1053,3800,1226],{"class":1194},[1053,3802,1191],{"class":1096},[1053,3804,3746],{"class":1260},[1053,3806,1333],{"class":1096},[1053,3808,3810],{"class":1055,"line":3809},160,[1053,3811,3812],{"class":1096},"            }\n",[1053,3814,3816],{"class":1055,"line":3815},161,[1053,3817,3818],{"class":1096},"        }\n",[1053,3820,3822],{"class":1055,"line":3821},162,[1053,3823,1121],{"emptyLinePlaceholder":1120},[1053,3825,3827],{"class":1055,"line":3826},163,[1053,3828,3829],{"class":1059},"# Usage\n",[1053,3831,3833,3836,3838,3840,3842,3844,3847,3849],{"class":1055,"line":3832},164,[1053,3834,3835],{"class":1070},"analyzer ",[1053,3837,1521],{"class":1096},[1053,3839,1132],{"class":1260},[1053,3841,1168],{"class":1096},[1053,3843,1489],{"class":1481},[1053,3845,3846],{"class":1485},"/path/to/django/project",[1053,3848,1489],{"class":1481},[1053,3850,1269],{"class":1096},[1053,3852,3854,3857,3859,3862,3864,3867],{"class":1055,"line":3853},165,[1053,3855,3856],{"class":1070},"report ",[1053,3858,1521],{"class":1096},[1053,3860,3861],{"class":1070}," analyzer",[1053,3863,1191],{"class":1096},[1053,3865,3866],{"class":1260},"analyze_project",[1053,3868,1333],{"class":1096},[1053,3870,3872,3875,3877,3880,3883,3887,3889,3891,3894,3896,3898,3900,3902,3905,3908,3911,3913,3915,3917,3919,3921,3923,3925,3927,3930],{"class":1055,"line":3871},166,[1053,3873,3874],{"class":1164},"print",[1053,3876,1168],{"class":1096},[1053,3878,3879],{"class":1127},"f",[1053,3881,3882],{"class":1485},"\"Found ",[1053,3884,3886],{"class":3885},"s3h35","{",[1053,3888,3576],{"class":1164},[1053,3890,1168],{"class":1096},[1053,3892,3893],{"class":1260},"report",[1053,3895,1723],{"class":1096},[1053,3897,1489],{"class":1481},[1053,3899,1211],{"class":1485},[1053,3901,1489],{"class":1481},[1053,3903,3904],{"class":1096},"])",[1053,3906,3907],{"class":3885},"}",[1053,3909,3910],{"class":1485}," apps with ",[1053,3912,3886],{"class":3885},[1053,3914,3893],{"class":1260},[1053,3916,1723],{"class":1096},[1053,3918,1489],{"class":1481},[1053,3920,3564],{"class":1485},[1053,3922,1489],{"class":1481},[1053,3924,1729],{"class":1096},[1053,3926,3907],{"class":3885},[1053,3928,3929],{"class":1485}," models\"",[1053,3931,1269],{"class":1096},[1035,3933,3935],{"id":3934},"_2-service-boundary-identification","2. Service Boundary Identification",[1026,3937,3938],{},"Identify potential service boundaries using Domain-Driven Design:",[1043,3940,3942],{"className":1045,"code":3941,"language":1047,"meta":1048,"style":1048},"# service_boundaries.py\nfrom collections import defaultdict\nimport networkx as nx\n\nclass ServiceBoundaryIdentifier:\n    \"\"\"Identify potential microservice boundaries\"\"\"\n    \n    def __init__(self, analysis_report):\n        self.report = analysis_report\n        self.dependency_graph = nx.DiGraph()\n        self.cohesion_scores = {}\n        self.coupling_scores = {}\n    \n    def identify_boundaries(self):\n        \"\"\"Identify service boundaries using various metrics\"\"\"\n        self._build_dependency_graph()\n        self._calculate_cohesion()\n        self._calculate_coupling()\n        self._identify_clusters()\n        \n        return self._generate_recommendations()\n    \n    def _build_dependency_graph(self):\n        \"\"\"Build dependency graph between apps\"\"\"\n        for app, dependencies in self.report['app_dependencies'].items():\n            for dep in dependencies:\n                if dep in self.report['apps']:\n                    self.dependency_graph.add_edge(app, dep)\n    \n    def _calculate_cohesion(self):\n        \"\"\"Calculate cohesion within each app\"\"\"\n        for app in self.report['apps']:\n            model_count = self.report['models_by_app'].get(app, 0)\n            complexity = self.report['complexity_by_app'].get(app, 0)\n            \n            # Higher model count and complexity indicate higher cohesion\n            self.cohesion_scores[app] = model_count * 0.6 + complexity * 0.4\n    \n    def _calculate_coupling(self):\n        \"\"\"Calculate coupling between apps\"\"\"\n        for app in self.report['apps']:\n            dependencies = self.report['app_dependencies'].get(app, set())\n            # More dependencies indicate higher coupling\n            self.coupling_scores[app] = len(dependencies)\n    \n    def _identify_clusters(self):\n        \"\"\"Identify clusters of related apps\"\"\"\n        # Use community detection algorithms\n        try:\n            import community\n            partition = community.best_partition(self.dependency_graph.to_undirected())\n            \n            clusters = defaultdict(list)\n            for app, cluster_id in partition.items():\n                clusters[cluster_id].append(app)\n            \n            return dict(clusters)\n        except ImportError:\n            # Fallback to simple clustering\n            return self._simple_clustering()\n    \n    def _simple_clustering(self):\n        \"\"\"Simple clustering based on dependencies\"\"\"\n        clusters = defaultdict(list)\n        visited = set()\n        cluster_id = 0\n        \n        for app in self.report['apps']:\n            if app not in visited:\n                cluster = self._get_connected_components(app, visited)\n                clusters[cluster_id] = cluster\n                cluster_id += 1\n        \n        return dict(clusters)\n    \n    def _get_connected_components(self, start_app, visited):\n        \"\"\"Get connected components starting from an app\"\"\"\n        component = []\n        stack = [start_app]\n        \n        while stack:\n            app = stack.pop()\n            if app not in visited:\n                visited.add(app)\n                component.append(app)\n                \n                # Add neighbors\n                neighbors = list(self.dependency_graph.neighbors(app))\n                neighbors.extend(list(self.dependency_graph.predecessors(app)))\n                \n                for neighbor in neighbors:\n                    if neighbor not in visited:\n                        stack.append(neighbor)\n        \n        return component\n    \n    def _generate_recommendations(self):\n        \"\"\"Generate service boundary recommendations\"\"\"\n        clusters = self._identify_clusters()\n        \n        recommendations = []\n        \n        for cluster_id, apps in clusters.items():\n            total_models = sum(self.report['models_by_app'].get(app, 0) for app in apps)\n            total_complexity = sum(self.report['complexity_by_app'].get(app, 0) for app in apps)\n            avg_coupling = sum(self.coupling_scores.get(app, 0) for app in apps) / len(apps)\n            \n            service_name = f\"service_{cluster_id}\"\n            if len(apps) == 1:\n                service_name = f\"{apps[0]}_service\"\n            elif 'user' in apps:\n                service_name = \"user_service\"\n            elif 'product' in apps:\n                service_name = \"product_service\"\n            elif 'order' in apps:\n                service_name = \"order_service\"\n            \n            recommendations.append({\n                'service_name': service_name,\n                'apps': apps,\n                'total_models': total_models,\n                'total_complexity': total_complexity,\n                'average_coupling': avg_coupling,\n                'recommendation_score': self._calculate_recommendation_score(\n                    total_models, total_complexity, avg_coupling\n                )\n            })\n        \n        # Sort by recommendation score\n        recommendations.sort(key=lambda x: x['recommendation_score'], reverse=True)\n        \n        return recommendations\n    \n    def _calculate_recommendation_score(self, models, complexity, coupling):\n        \"\"\"Calculate recommendation score for service boundary\"\"\"\n        # Higher models and complexity, lower coupling = better service boundary\n        return (models * 0.4 + complexity * 0.4) - (coupling * 0.2)\n\n# Usage\nboundary_identifier = ServiceBoundaryIdentifier(report)\nrecommendations = boundary_identifier.identify_boundaries()\n\nfor rec in recommendations:\n    print(f\"Service: {rec['service_name']}\")\n    print(f\"Apps: {rec['apps']}\")\n    print(f\"Score: {rec['recommendation_score']:.2f}\")\n    print(\"---\")\n",[1050,3943,3944,3949,3960,3970,3974,3983,3992,3996,4013,4026,4047,4060,4073,4077,4090,4099,4110,4121,4132,4143,4147,4160,4164,4177,4186,4220,4234,4258,4282,4286,4299,4308,4332,4369,4404,4408,4413,4450,4454,4467,4476,4500,4536,4541,4565,4569,4582,4591,4596,4602,4610,4640,4644,4660,4682,4702,4706,4719,4728,4733,4746,4750,4763,4772,4787,4798,4808,4812,4836,4851,4875,4890,4899,4903,4915,4919,4941,4950,4959,4974,4978,4988,5004,5018,5033,5048,5053,5058,5088,5122,5126,5140,5154,5170,5174,5181,5185,5198,5207,5221,5225,5234,5238,5261,5311,5360,5412,5416,5437,5456,5483,5501,5515,5532,5545,5562,5575,5579,5590,5607,5621,5636,5652,5668,5689,5703,5708,5713,5717,5722,5772,5776,5783,5787,5815,5824,5829,5868,5872,5876,5891,5908,5912,5927,5960,5991,6025],{"__ignoreMap":1048},[1053,3945,3946],{"class":1055,"line":1056},[1053,3947,3948],{"class":1059},"# service_boundaries.py\n",[1053,3950,3951,3953,3955,3957],{"class":1055,"line":1063},[1053,3952,1085],{"class":1066},[1053,3954,1088],{"class":1070},[1053,3956,1067],{"class":1066},[1053,3958,3959],{"class":1070}," defaultdict\n",[1053,3961,3962,3964,3966,3968],{"class":1055,"line":1074},[1053,3963,1067],{"class":1066},[1053,3965,1108],{"class":1070},[1053,3967,1111],{"class":1066},[1053,3969,1114],{"class":1070},[1053,3971,3972],{"class":1055,"line":1082},[1053,3973,1121],{"emptyLinePlaceholder":1120},[1053,3975,3976,3978,3981],{"class":1055,"line":1103},[1053,3977,1128],{"class":1127},[1053,3979,3980],{"class":1131}," ServiceBoundaryIdentifier",[1053,3982,1135],{"class":1096},[1053,3984,3985,3987,3990],{"class":1055,"line":1117},[1053,3986,1142],{"class":1141},[1053,3988,3989],{"class":1145},"Identify potential microservice boundaries",[1053,3991,1149],{"class":1141},[1053,3993,3994],{"class":1055,"line":1124},[1053,3995,1155],{"class":1070},[1053,3997,3998,4000,4002,4004,4006,4008,4011],{"class":1055,"line":1138},[1053,3999,1161],{"class":1127},[1053,4001,1165],{"class":1164},[1053,4003,1168],{"class":1096},[1053,4005,1172],{"class":1171},[1053,4007,1097],{"class":1096},[1053,4009,4010],{"class":1177}," analysis_report",[1053,4012,1181],{"class":1096},[1053,4014,4015,4017,4019,4021,4023],{"class":1055,"line":1152},[1053,4016,1188],{"class":1187},[1053,4018,1191],{"class":1096},[1053,4020,3893],{"class":1194},[1053,4022,1198],{"class":1096},[1053,4024,4025],{"class":1070}," analysis_report\n",[1053,4027,4028,4030,4032,4035,4037,4040,4042,4045],{"class":1055,"line":1158},[1053,4029,1188],{"class":1187},[1053,4031,1191],{"class":1096},[1053,4033,4034],{"class":1194},"dependency_graph",[1053,4036,1198],{"class":1096},[1053,4038,4039],{"class":1070}," nx",[1053,4041,1191],{"class":1096},[1053,4043,4044],{"class":1260},"DiGraph",[1053,4046,1333],{"class":1096},[1053,4048,4049,4051,4053,4056,4058],{"class":1055,"line":1184},[1053,4050,1188],{"class":1187},[1053,4052,1191],{"class":1096},[1053,4054,4055],{"class":1194},"cohesion_scores",[1053,4057,1198],{"class":1096},[1053,4059,1231],{"class":1096},[1053,4061,4062,4064,4066,4069,4071],{"class":1055,"line":1204},[1053,4063,1188],{"class":1187},[1053,4065,1191],{"class":1096},[1053,4067,4068],{"class":1194},"coupling_scores",[1053,4070,1198],{"class":1096},[1053,4072,1231],{"class":1096},[1053,4074,4075],{"class":1055,"line":1219},[1053,4076,1155],{"class":1070},[1053,4078,4079,4081,4084,4086,4088],{"class":1055,"line":1234},[1053,4080,1161],{"class":1127},[1053,4082,4083],{"class":1302}," identify_boundaries",[1053,4085,1168],{"class":1096},[1053,4087,1172],{"class":1171},[1053,4089,1181],{"class":1096},[1053,4091,4092,4094,4097],{"class":1055,"line":1248},[1053,4093,1315],{"class":1141},[1053,4095,4096],{"class":1145},"Identify service boundaries using various metrics",[1053,4098,1149],{"class":1141},[1053,4100,4101,4103,4105,4108],{"class":1055,"line":1272},[1053,4102,1188],{"class":1187},[1053,4104,1191],{"class":1096},[1053,4106,4107],{"class":1260},"_build_dependency_graph",[1053,4109,1333],{"class":1096},[1053,4111,4112,4114,4116,4119],{"class":1055,"line":1292},[1053,4113,1188],{"class":1187},[1053,4115,1191],{"class":1096},[1053,4117,4118],{"class":1260},"_calculate_cohesion",[1053,4120,1333],{"class":1096},[1053,4122,4123,4125,4127,4130],{"class":1055,"line":1297},[1053,4124,1188],{"class":1187},[1053,4126,1191],{"class":1096},[1053,4128,4129],{"class":1260},"_calculate_coupling",[1053,4131,1333],{"class":1096},[1053,4133,4134,4136,4138,4141],{"class":1055,"line":1312},[1053,4135,1188],{"class":1187},[1053,4137,1191],{"class":1096},[1053,4139,4140],{"class":1260},"_identify_clusters",[1053,4142,1333],{"class":1096},[1053,4144,4145],{"class":1055,"line":1323},[1053,4146,1387],{"class":1070},[1053,4148,4149,4151,4153,4155,4158],{"class":1055,"line":1336},[1053,4150,1393],{"class":1066},[1053,4152,1396],{"class":1187},[1053,4154,1191],{"class":1096},[1053,4156,4157],{"class":1260},"_generate_recommendations",[1053,4159,1333],{"class":1096},[1053,4161,4162],{"class":1055,"line":1348},[1053,4163,1155],{"class":1070},[1053,4165,4166,4168,4171,4173,4175],{"class":1055,"line":1360},[1053,4167,1161],{"class":1127},[1053,4169,4170],{"class":1302}," _build_dependency_graph",[1053,4172,1168],{"class":1096},[1053,4174,1172],{"class":1171},[1053,4176,1181],{"class":1096},[1053,4178,4179,4181,4184],{"class":1055,"line":1372},[1053,4180,1315],{"class":1141},[1053,4182,4183],{"class":1145},"Build dependency graph between apps",[1053,4185,1149],{"class":1141},[1053,4187,4188,4190,4192,4194,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217],{"class":1055,"line":1384},[1053,4189,1438],{"class":1066},[1053,4191,1677],{"class":1070},[1053,4193,1097],{"class":1096},[1053,4195,4196],{"class":1070}," dependencies ",[1053,4198,1454],{"class":1066},[1053,4200,1396],{"class":1187},[1053,4202,1191],{"class":1096},[1053,4204,3893],{"class":1194},[1053,4206,1723],{"class":1096},[1053,4208,1489],{"class":1481},[1053,4210,3654],{"class":1485},[1053,4212,1489],{"class":1481},[1053,4214,2099],{"class":1096},[1053,4216,3746],{"class":1260},[1053,4218,4219],{"class":1096},"():\n",[1053,4221,4222,4224,4227,4229,4232],{"class":1055,"line":1390},[1053,4223,1967],{"class":1066},[1053,4225,4226],{"class":1070}," dep ",[1053,4228,1454],{"class":1066},[1053,4230,4231],{"class":1070}," dependencies",[1053,4233,1135],{"class":1096},[1053,4235,4236,4238,4240,4242,4244,4246,4248,4250,4252,4254,4256],{"class":1055,"line":1406},[1053,4237,1546],{"class":1066},[1053,4239,4226],{"class":1070},[1053,4241,1454],{"class":1492},[1053,4243,1396],{"class":1187},[1053,4245,1191],{"class":1096},[1053,4247,3893],{"class":1194},[1053,4249,1723],{"class":1096},[1053,4251,1489],{"class":1481},[1053,4253,1211],{"class":1485},[1053,4255,1489],{"class":1481},[1053,4257,1576],{"class":1096},[1053,4259,4260,4262,4264,4266,4268,4271,4273,4275,4277,4280],{"class":1055,"line":1411},[1053,4261,1582],{"class":1187},[1053,4263,1191],{"class":1096},[1053,4265,4034],{"class":1194},[1053,4267,1191],{"class":1096},[1053,4269,4270],{"class":1260},"add_edge",[1053,4272,1168],{"class":1096},[1053,4274,1726],{"class":1260},[1053,4276,1097],{"class":1096},[1053,4278,4279],{"class":1260}," dep",[1053,4281,1269],{"class":1096},[1053,4283,4284],{"class":1055,"line":1425},[1053,4285,1155],{"class":1070},[1053,4287,4288,4290,4293,4295,4297],{"class":1055,"line":1435},[1053,4289,1161],{"class":1127},[1053,4291,4292],{"class":1302}," _calculate_cohesion",[1053,4294,1168],{"class":1096},[1053,4296,1172],{"class":1171},[1053,4298,1181],{"class":1096},[1053,4300,4301,4303,4306],{"class":1055,"line":1475},[1053,4302,1315],{"class":1141},[1053,4304,4305],{"class":1145},"Calculate cohesion within each app",[1053,4307,1149],{"class":1141},[1053,4309,4310,4312,4314,4316,4318,4320,4322,4324,4326,4328,4330],{"class":1055,"line":1515},[1053,4311,1438],{"class":1066},[1053,4313,1635],{"class":1070},[1053,4315,1454],{"class":1066},[1053,4317,1396],{"class":1187},[1053,4319,1191],{"class":1096},[1053,4321,3893],{"class":1194},[1053,4323,1723],{"class":1096},[1053,4325,1489],{"class":1481},[1053,4327,1211],{"class":1485},[1053,4329,1489],{"class":1481},[1053,4331,1576],{"class":1096},[1053,4333,4334,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4358,4360,4362,4364,4367],{"class":1055,"line":1543},[1053,4335,4336],{"class":1070},"            model_count ",[1053,4338,1521],{"class":1096},[1053,4340,1396],{"class":1187},[1053,4342,1191],{"class":1096},[1053,4344,3893],{"class":1194},[1053,4346,1723],{"class":1096},[1053,4348,1489],{"class":1481},[1053,4350,3762],{"class":1485},[1053,4352,1489],{"class":1481},[1053,4354,2099],{"class":1096},[1053,4356,4357],{"class":1260},"get",[1053,4359,1168],{"class":1096},[1053,4361,1726],{"class":1260},[1053,4363,1097],{"class":1096},[1053,4365,4366],{"class":3044}," 0",[1053,4368,1269],{"class":1096},[1053,4370,4371,4374,4376,4378,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402],{"class":1055,"line":1579},[1053,4372,4373],{"class":1070},"            complexity ",[1053,4375,1521],{"class":1096},[1053,4377,1396],{"class":1187},[1053,4379,1191],{"class":1096},[1053,4381,3893],{"class":1194},[1053,4383,1723],{"class":1096},[1053,4385,1489],{"class":1481},[1053,4387,3679],{"class":1485},[1053,4389,1489],{"class":1481},[1053,4391,2099],{"class":1096},[1053,4393,4357],{"class":1260},[1053,4395,1168],{"class":1096},[1053,4397,1726],{"class":1260},[1053,4399,1097],{"class":1096},[1053,4401,4366],{"class":3044},[1053,4403,1269],{"class":1096},[1053,4405,4406],{"class":1055,"line":1601},[1053,4407,2245],{"class":1070},[1053,4409,4410],{"class":1055,"line":1606},[1053,4411,4412],{"class":1059},"            # Higher model count and complexity indicate higher cohesion\n",[1053,4414,4415,4418,4420,4422,4424,4426,4428,4430,4433,4436,4439,4442,4445,4447],{"class":1055,"line":1620},[1053,4416,4417],{"class":1187},"            self",[1053,4419,1191],{"class":1096},[1053,4421,4055],{"class":1194},[1053,4423,1723],{"class":1096},[1053,4425,1726],{"class":1194},[1053,4427,1729],{"class":1096},[1053,4429,1198],{"class":1096},[1053,4431,4432],{"class":1070}," model_count ",[1053,4434,4435],{"class":1492},"*",[1053,4437,4438],{"class":3044}," 0.6",[1053,4440,4441],{"class":1492}," +",[1053,4443,4444],{"class":1070}," complexity ",[1053,4446,4435],{"class":1492},[1053,4448,4449],{"class":3044}," 0.4\n",[1053,4451,4452],{"class":1055,"line":1630},[1053,4453,1155],{"class":1070},[1053,4455,4456,4458,4461,4463,4465],{"class":1055,"line":1648},[1053,4457,1161],{"class":1127},[1053,4459,4460],{"class":1302}," _calculate_coupling",[1053,4462,1168],{"class":1096},[1053,4464,1172],{"class":1171},[1053,4466,1181],{"class":1096},[1053,4468,4469,4471,4474],{"class":1055,"line":1690},[1053,4470,1315],{"class":1141},[1053,4472,4473],{"class":1145},"Calculate coupling between apps",[1053,4475,1149],{"class":1141},[1053,4477,4478,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498],{"class":1055,"line":1713},[1053,4479,1438],{"class":1066},[1053,4481,1635],{"class":1070},[1053,4483,1454],{"class":1066},[1053,4485,1396],{"class":1187},[1053,4487,1191],{"class":1096},[1053,4489,3893],{"class":1194},[1053,4491,1723],{"class":1096},[1053,4493,1489],{"class":1481},[1053,4495,1211],{"class":1485},[1053,4497,1489],{"class":1481},[1053,4499,1576],{"class":1096},[1053,4501,4502,4505,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529,4531,4533],{"class":1055,"line":1747},[1053,4503,4504],{"class":1070},"            dependencies ",[1053,4506,1521],{"class":1096},[1053,4508,1396],{"class":1187},[1053,4510,1191],{"class":1096},[1053,4512,3893],{"class":1194},[1053,4514,1723],{"class":1096},[1053,4516,1489],{"class":1481},[1053,4518,3654],{"class":1485},[1053,4520,1489],{"class":1481},[1053,4522,2099],{"class":1096},[1053,4524,4357],{"class":1260},[1053,4526,1168],{"class":1096},[1053,4528,1726],{"class":1260},[1053,4530,1097],{"class":1096},[1053,4532,3195],{"class":1265},[1053,4534,4535],{"class":1096},"())\n",[1053,4537,4538],{"class":1055,"line":1752},[1053,4539,4540],{"class":1059},"            # More dependencies indicate higher coupling\n",[1053,4542,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563],{"class":1055,"line":1766},[1053,4544,4417],{"class":1187},[1053,4546,1191],{"class":1096},[1053,4548,4068],{"class":1194},[1053,4550,1723],{"class":1096},[1053,4552,1726],{"class":1194},[1053,4554,1729],{"class":1096},[1053,4556,1198],{"class":1096},[1053,4558,3778],{"class":1164},[1053,4560,1168],{"class":1096},[1053,4562,1255],{"class":1260},[1053,4564,1269],{"class":1096},[1053,4566,4567],{"class":1055,"line":1776},[1053,4568,1155],{"class":1070},[1053,4570,4571,4573,4576,4578,4580],{"class":1055,"line":1793},[1053,4572,1161],{"class":1127},[1053,4574,4575],{"class":1302}," _identify_clusters",[1053,4577,1168],{"class":1096},[1053,4579,1172],{"class":1171},[1053,4581,1181],{"class":1096},[1053,4583,4584,4586,4589],{"class":1055,"line":1834},[1053,4585,1315],{"class":1141},[1053,4587,4588],{"class":1145},"Identify clusters of related apps",[1053,4590,1149],{"class":1141},[1053,4592,4593],{"class":1055,"line":1856},[1053,4594,4595],{"class":1059},"        # Use community detection algorithms\n",[1053,4597,4598,4600],{"class":1055,"line":1886},[1053,4599,2204],{"class":1066},[1053,4601,1135],{"class":1096},[1053,4603,4604,4607],{"class":1055,"line":1891},[1053,4605,4606],{"class":1066},"            import",[1053,4608,4609],{"class":1070}," community\n",[1053,4611,4612,4615,4617,4620,4622,4625,4627,4629,4631,4633,4635,4638],{"class":1055,"line":1905},[1053,4613,4614],{"class":1070},"            partition ",[1053,4616,1521],{"class":1096},[1053,4618,4619],{"class":1070}," community",[1053,4621,1191],{"class":1096},[1053,4623,4624],{"class":1260},"best_partition",[1053,4626,1168],{"class":1096},[1053,4628,1172],{"class":1187},[1053,4630,1191],{"class":1096},[1053,4632,4034],{"class":1194},[1053,4634,1191],{"class":1096},[1053,4636,4637],{"class":1260},"to_undirected",[1053,4639,4535],{"class":1096},[1053,4641,4642],{"class":1055,"line":1915},[1053,4643,2245],{"class":1070},[1053,4645,4646,4649,4651,4653,4655,4658],{"class":1055,"line":1932},[1053,4647,4648],{"class":1070},"            clusters ",[1053,4650,1521],{"class":1096},[1053,4652,1093],{"class":1260},[1053,4654,1168],{"class":1096},[1053,4656,4657],{"class":1265},"list",[1053,4659,1269],{"class":1096},[1053,4661,4662,4664,4666,4668,4671,4673,4676,4678,4680],{"class":1055,"line":1964},[1053,4663,1967],{"class":1066},[1053,4665,1677],{"class":1070},[1053,4667,1097],{"class":1096},[1053,4669,4670],{"class":1070}," cluster_id ",[1053,4672,1454],{"class":1066},[1053,4674,4675],{"class":1070}," partition",[1053,4677,1191],{"class":1096},[1053,4679,3746],{"class":1260},[1053,4681,4219],{"class":1096},[1053,4683,4684,4687,4689,4692,4694,4696,4698,4700],{"class":1055,"line":1995},[1053,4685,4686],{"class":1070},"                clusters",[1053,4688,1723],{"class":1096},[1053,4690,4691],{"class":1070},"cluster_id",[1053,4693,2099],{"class":1096},[1053,4695,1591],{"class":1260},[1053,4697,1168],{"class":1096},[1053,4699,1726],{"class":1260},[1053,4701,1269],{"class":1096},[1053,4703,4704],{"class":1055,"line":2011},[1053,4705,2245],{"class":1070},[1053,4707,4708,4710,4712,4714,4717],{"class":1055,"line":2035},[1053,4709,2502],{"class":1066},[1053,4711,3661],{"class":1265},[1053,4713,1168],{"class":1096},[1053,4715,4716],{"class":1260},"clusters",[1053,4718,1269],{"class":1096},[1053,4720,4721,4723,4726],{"class":1055,"line":2063},[1053,4722,2511],{"class":1066},[1053,4724,4725],{"class":1265}," ImportError",[1053,4727,1135],{"class":1096},[1053,4729,4730],{"class":1055,"line":2085},[1053,4731,4732],{"class":1059},"            # Fallback to simple clustering\n",[1053,4734,4735,4737,4739,4741,4744],{"class":1055,"line":2112},[1053,4736,2502],{"class":1066},[1053,4738,1396],{"class":1187},[1053,4740,1191],{"class":1096},[1053,4742,4743],{"class":1260},"_simple_clustering",[1053,4745,1333],{"class":1096},[1053,4747,4748],{"class":1055,"line":2117},[1053,4749,1155],{"class":1070},[1053,4751,4752,4754,4757,4759,4761],{"class":1055,"line":2136},[1053,4753,1161],{"class":1127},[1053,4755,4756],{"class":1302}," _simple_clustering",[1053,4758,1168],{"class":1096},[1053,4760,1172],{"class":1171},[1053,4762,1181],{"class":1096},[1053,4764,4765,4767,4770],{"class":1055,"line":2146},[1053,4766,1315],{"class":1141},[1053,4768,4769],{"class":1145},"Simple clustering based on dependencies",[1053,4771,1149],{"class":1141},[1053,4773,4774,4777,4779,4781,4783,4785],{"class":1055,"line":2179},[1053,4775,4776],{"class":1070},"        clusters ",[1053,4778,1521],{"class":1096},[1053,4780,1093],{"class":1260},[1053,4782,1168],{"class":1096},[1053,4784,4657],{"class":1265},[1053,4786,1269],{"class":1096},[1053,4788,4789,4792,4794,4796],{"class":1055,"line":2196},[1053,4790,4791],{"class":1070},"        visited ",[1053,4793,1521],{"class":1096},[1053,4795,3195],{"class":1265},[1053,4797,1333],{"class":1096},[1053,4799,4800,4803,4805],{"class":1055,"line":2201},[1053,4801,4802],{"class":1070},"        cluster_id ",[1053,4804,1521],{"class":1096},[1053,4806,4807],{"class":3044}," 0\n",[1053,4809,4810],{"class":1055,"line":2209},[1053,4811,1387],{"class":1070},[1053,4813,4814,4816,4818,4820,4822,4824,4826,4828,4830,4832,4834],{"class":1055,"line":2232},[1053,4815,1438],{"class":1066},[1053,4817,1635],{"class":1070},[1053,4819,1454],{"class":1066},[1053,4821,1396],{"class":1187},[1053,4823,1191],{"class":1096},[1053,4825,3893],{"class":1194},[1053,4827,1723],{"class":1096},[1053,4829,1489],{"class":1481},[1053,4831,1211],{"class":1485},[1053,4833,1489],{"class":1481},[1053,4835,1576],{"class":1096},[1053,4837,4838,4840,4842,4844,4846,4849],{"class":1055,"line":2242},[1053,4839,1478],{"class":1066},[1053,4841,1635],{"class":1070},[1053,4843,1552],{"class":1492},[1053,4845,1493],{"class":1492},[1053,4847,4848],{"class":1070}," visited",[1053,4850,1135],{"class":1096},[1053,4852,4853,4856,4858,4860,4862,4865,4867,4869,4871,4873],{"class":1055,"line":2248},[1053,4854,4855],{"class":1070},"                cluster ",[1053,4857,1521],{"class":1096},[1053,4859,1396],{"class":1187},[1053,4861,1191],{"class":1096},[1053,4863,4864],{"class":1260},"_get_connected_components",[1053,4866,1168],{"class":1096},[1053,4868,1726],{"class":1260},[1053,4870,1097],{"class":1096},[1053,4872,4848],{"class":1260},[1053,4874,1269],{"class":1096},[1053,4876,4877,4879,4881,4883,4885,4887],{"class":1055,"line":2271},[1053,4878,4686],{"class":1070},[1053,4880,1723],{"class":1096},[1053,4882,4691],{"class":1070},[1053,4884,1729],{"class":1096},[1053,4886,1198],{"class":1096},[1053,4888,4889],{"class":1070}," cluster\n",[1053,4891,4892,4895,4897],{"class":1055,"line":2295},[1053,4893,4894],{"class":1070},"                cluster_id ",[1053,4896,3140],{"class":1096},[1053,4898,3045],{"class":3044},[1053,4900,4901],{"class":1055,"line":2301},[1053,4902,1387],{"class":1070},[1053,4904,4905,4907,4909,4911,4913],{"class":1055,"line":2322},[1053,4906,1393],{"class":1066},[1053,4908,3661],{"class":1265},[1053,4910,1168],{"class":1096},[1053,4912,4716],{"class":1260},[1053,4914,1269],{"class":1096},[1053,4916,4917],{"class":1055,"line":2369},[1053,4918,1155],{"class":1070},[1053,4920,4921,4923,4926,4928,4930,4932,4935,4937,4939],{"class":1055,"line":2382},[1053,4922,1161],{"class":1127},[1053,4924,4925],{"class":1302}," _get_connected_components",[1053,4927,1168],{"class":1096},[1053,4929,1172],{"class":1171},[1053,4931,1097],{"class":1096},[1053,4933,4934],{"class":1177}," start_app",[1053,4936,1097],{"class":1096},[1053,4938,4848],{"class":1177},[1053,4940,1181],{"class":1096},[1053,4942,4943,4945,4948],{"class":1055,"line":2405},[1053,4944,1315],{"class":1141},[1053,4946,4947],{"class":1145},"Get connected components starting from an app",[1053,4949,1149],{"class":1141},[1053,4951,4952,4955,4957],{"class":1055,"line":2431},[1053,4953,4954],{"class":1070},"        component ",[1053,4956,1521],{"class":1096},[1053,4958,1216],{"class":1096},[1053,4960,4961,4964,4966,4968,4971],{"class":1055,"line":2488},[1053,4962,4963],{"class":1070},"        stack ",[1053,4965,1521],{"class":1096},[1053,4967,1557],{"class":1096},[1053,4969,4970],{"class":1070},"start_app",[1053,4972,4973],{"class":1096},"]\n",[1053,4975,4976],{"class":1055,"line":2494},[1053,4977,1387],{"class":1070},[1053,4979,4980,4983,4986],{"class":1055,"line":2499},[1053,4981,4982],{"class":1066},"        while",[1053,4984,4985],{"class":1070}," stack",[1053,4987,1135],{"class":1096},[1053,4989,4990,4993,4995,4997,4999,5002],{"class":1055,"line":2508},[1053,4991,4992],{"class":1070},"            app ",[1053,4994,1521],{"class":1096},[1053,4996,4985],{"class":1070},[1053,4998,1191],{"class":1096},[1053,5000,5001],{"class":1260},"pop",[1053,5003,1333],{"class":1096},[1053,5005,5006,5008,5010,5012,5014,5016],{"class":1055,"line":2519},[1053,5007,1478],{"class":1066},[1053,5009,1635],{"class":1070},[1053,5011,1552],{"class":1492},[1053,5013,1493],{"class":1492},[1053,5015,4848],{"class":1070},[1053,5017,1135],{"class":1096},[1053,5019,5020,5023,5025,5027,5029,5031],{"class":1055,"line":2526},[1053,5021,5022],{"class":1070},"                visited",[1053,5024,1191],{"class":1096},[1053,5026,3355],{"class":1260},[1053,5028,1168],{"class":1096},[1053,5030,1726],{"class":1260},[1053,5032,1269],{"class":1096},[1053,5034,5035,5038,5040,5042,5044,5046],{"class":1055,"line":2531},[1053,5036,5037],{"class":1070},"                component",[1053,5039,1191],{"class":1096},[1053,5041,1591],{"class":1260},[1053,5043,1168],{"class":1096},[1053,5045,1726],{"class":1260},[1053,5047,1269],{"class":1096},[1053,5049,5050],{"class":1055,"line":2550},[1053,5051,5052],{"class":1070},"                \n",[1053,5054,5055],{"class":1055,"line":2560},[1053,5056,5057],{"class":1059},"                # Add neighbors\n",[1053,5059,5060,5063,5065,5068,5070,5072,5074,5076,5078,5081,5083,5085],{"class":1055,"line":2570},[1053,5061,5062],{"class":1070},"                neighbors ",[1053,5064,1521],{"class":1096},[1053,5066,5067],{"class":1265}," list",[1053,5069,1168],{"class":1096},[1053,5071,1172],{"class":1187},[1053,5073,1191],{"class":1096},[1053,5075,4034],{"class":1194},[1053,5077,1191],{"class":1096},[1053,5079,5080],{"class":1260},"neighbors",[1053,5082,1168],{"class":1096},[1053,5084,1726],{"class":1260},[1053,5086,5087],{"class":1096},"))\n",[1053,5089,5090,5093,5095,5098,5100,5102,5104,5106,5108,5110,5112,5115,5117,5119],{"class":1055,"line":2587},[1053,5091,5092],{"class":1070},"                neighbors",[1053,5094,1191],{"class":1096},[1053,5096,5097],{"class":1260},"extend",[1053,5099,1168],{"class":1096},[1053,5101,4657],{"class":1265},[1053,5103,1168],{"class":1096},[1053,5105,1172],{"class":1187},[1053,5107,1191],{"class":1096},[1053,5109,4034],{"class":1194},[1053,5111,1191],{"class":1096},[1053,5113,5114],{"class":1260},"predecessors",[1053,5116,1168],{"class":1096},[1053,5118,1726],{"class":1260},[1053,5120,5121],{"class":1096},")))\n",[1053,5123,5124],{"class":1055,"line":2609},[1053,5125,5052],{"class":1070},[1053,5127,5128,5130,5133,5135,5138],{"class":1055,"line":2628},[1053,5129,1998],{"class":1066},[1053,5131,5132],{"class":1070}," neighbor ",[1053,5134,1454],{"class":1066},[1053,5136,5137],{"class":1070}," neighbors",[1053,5139,1135],{"class":1096},[1053,5141,5142,5144,5146,5148,5150,5152],{"class":1055,"line":2651},[1053,5143,2014],{"class":1066},[1053,5145,5132],{"class":1070},[1053,5147,1552],{"class":1492},[1053,5149,1493],{"class":1492},[1053,5151,4848],{"class":1070},[1053,5153,1135],{"class":1096},[1053,5155,5156,5159,5161,5163,5165,5168],{"class":1055,"line":2672},[1053,5157,5158],{"class":1070},"                        stack",[1053,5160,1191],{"class":1096},[1053,5162,1591],{"class":1260},[1053,5164,1168],{"class":1096},[1053,5166,5167],{"class":1260},"neighbor",[1053,5169,1269],{"class":1096},[1053,5171,5172],{"class":1055,"line":2680},[1053,5173,1387],{"class":1070},[1053,5175,5176,5178],{"class":1055,"line":2685},[1053,5177,1393],{"class":1066},[1053,5179,5180],{"class":1070}," component\n",[1053,5182,5183],{"class":1055,"line":2704},[1053,5184,1155],{"class":1070},[1053,5186,5187,5189,5192,5194,5196],{"class":1055,"line":2714},[1053,5188,1161],{"class":1127},[1053,5190,5191],{"class":1302}," _generate_recommendations",[1053,5193,1168],{"class":1096},[1053,5195,1172],{"class":1171},[1053,5197,1181],{"class":1096},[1053,5199,5200,5202,5205],{"class":1055,"line":2741},[1053,5201,1315],{"class":1141},[1053,5203,5204],{"class":1145},"Generate service boundary recommendations",[1053,5206,1149],{"class":1141},[1053,5208,5209,5211,5213,5215,5217,5219],{"class":1055,"line":2756},[1053,5210,4776],{"class":1070},[1053,5212,1521],{"class":1096},[1053,5214,1396],{"class":1187},[1053,5216,1191],{"class":1096},[1053,5218,4140],{"class":1260},[1053,5220,1333],{"class":1096},[1053,5222,5223],{"class":1055,"line":2761},[1053,5224,1387],{"class":1070},[1053,5226,5227,5230,5232],{"class":1055,"line":2768},[1053,5228,5229],{"class":1070},"        recommendations ",[1053,5231,1521],{"class":1096},[1053,5233,1216],{"class":1096},[1053,5235,5236],{"class":1055,"line":2787},[1053,5237,1387],{"class":1070},[1053,5239,5240,5242,5245,5247,5250,5252,5255,5257,5259],{"class":1055,"line":2797},[1053,5241,1438],{"class":1066},[1053,5243,5244],{"class":1070}," cluster_id",[1053,5246,1097],{"class":1096},[1053,5248,5249],{"class":1070}," apps ",[1053,5251,1454],{"class":1066},[1053,5253,5254],{"class":1070}," clusters",[1053,5256,1191],{"class":1096},[1053,5258,3746],{"class":1260},[1053,5260,4219],{"class":1096},[1053,5262,5263,5266,5268,5270,5272,5274,5276,5278,5280,5282,5284,5286,5288,5290,5292,5294,5296,5298,5300,5302,5304,5306,5309],{"class":1055,"line":2802},[1053,5264,5265],{"class":1070},"            total_models ",[1053,5267,1521],{"class":1096},[1053,5269,3571],{"class":1164},[1053,5271,1168],{"class":1096},[1053,5273,1172],{"class":1187},[1053,5275,1191],{"class":1096},[1053,5277,3893],{"class":1194},[1053,5279,1723],{"class":1096},[1053,5281,1489],{"class":1481},[1053,5283,3762],{"class":1485},[1053,5285,1489],{"class":1481},[1053,5287,2099],{"class":1096},[1053,5289,4357],{"class":1260},[1053,5291,1168],{"class":1096},[1053,5293,1726],{"class":1260},[1053,5295,1097],{"class":1096},[1053,5297,4366],{"class":3044},[1053,5299,2168],{"class":1096},[1053,5301,2452],{"class":1066},[1053,5303,1635],{"class":1260},[1053,5305,1454],{"class":1066},[1053,5307,5308],{"class":1260}," apps",[1053,5310,1269],{"class":1096},[1053,5312,5313,5316,5318,5320,5322,5324,5326,5328,5330,5332,5334,5336,5338,5340,5342,5344,5346,5348,5350,5352,5354,5356,5358],{"class":1055,"line":2823},[1053,5314,5315],{"class":1070},"            total_complexity ",[1053,5317,1521],{"class":1096},[1053,5319,3571],{"class":1164},[1053,5321,1168],{"class":1096},[1053,5323,1172],{"class":1187},[1053,5325,1191],{"class":1096},[1053,5327,3893],{"class":1194},[1053,5329,1723],{"class":1096},[1053,5331,1489],{"class":1481},[1053,5333,3679],{"class":1485},[1053,5335,1489],{"class":1481},[1053,5337,2099],{"class":1096},[1053,5339,4357],{"class":1260},[1053,5341,1168],{"class":1096},[1053,5343,1726],{"class":1260},[1053,5345,1097],{"class":1096},[1053,5347,4366],{"class":3044},[1053,5349,2168],{"class":1096},[1053,5351,2452],{"class":1066},[1053,5353,1635],{"class":1260},[1053,5355,1454],{"class":1066},[1053,5357,5308],{"class":1260},[1053,5359,1269],{"class":1096},[1053,5361,5362,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5404,5406,5408,5410],{"class":1055,"line":2863},[1053,5363,5364],{"class":1070},"            avg_coupling ",[1053,5366,1521],{"class":1096},[1053,5368,3571],{"class":1164},[1053,5370,1168],{"class":1096},[1053,5372,1172],{"class":1187},[1053,5374,1191],{"class":1096},[1053,5376,4068],{"class":1194},[1053,5378,1191],{"class":1096},[1053,5380,4357],{"class":1260},[1053,5382,1168],{"class":1096},[1053,5384,1726],{"class":1260},[1053,5386,1097],{"class":1096},[1053,5388,4366],{"class":3044},[1053,5390,2168],{"class":1096},[1053,5392,2452],{"class":1066},[1053,5394,1635],{"class":1260},[1053,5396,1454],{"class":1066},[1053,5398,5308],{"class":1260},[1053,5400,2168],{"class":1096},[1053,5402,5403],{"class":1492}," /",[1053,5405,3778],{"class":1164},[1053,5407,1168],{"class":1096},[1053,5409,1211],{"class":1260},[1053,5411,1269],{"class":1096},[1053,5413,5414],{"class":1055,"line":2875},[1053,5415,2245],{"class":1070},[1053,5417,5418,5421,5423,5425,5428,5430,5432,5434],{"class":1055,"line":2895},[1053,5419,5420],{"class":1070},"            service_name ",[1053,5422,1521],{"class":1096},[1053,5424,2174],{"class":1127},[1053,5426,5427],{"class":1485},"\"service_",[1053,5429,3886],{"class":3885},[1053,5431,4691],{"class":1070},[1053,5433,3907],{"class":3885},[1053,5435,5436],{"class":1485},"\"\n",[1053,5438,5439,5441,5443,5445,5447,5449,5451,5454],{"class":1055,"line":2943},[1053,5440,1478],{"class":1066},[1053,5442,3778],{"class":1164},[1053,5444,1168],{"class":1096},[1053,5446,1211],{"class":1260},[1053,5448,2168],{"class":1096},[1053,5450,2357],{"class":1492},[1053,5452,5453],{"class":3044}," 1",[1053,5455,1135],{"class":1096},[1053,5457,5458,5461,5463,5465,5468,5470,5472,5474,5476,5478,5480],{"class":1055,"line":2968},[1053,5459,5460],{"class":1070},"                service_name ",[1053,5462,1521],{"class":1096},[1053,5464,2174],{"class":1127},[1053,5466,5467],{"class":1485},"\"",[1053,5469,3886],{"class":3885},[1053,5471,1211],{"class":1070},[1053,5473,1723],{"class":1096},[1053,5475,3383],{"class":3044},[1053,5477,1729],{"class":1096},[1053,5479,3907],{"class":3885},[1053,5481,5482],{"class":1485},"_service\"\n",[1053,5484,5485,5488,5490,5493,5495,5497,5499],{"class":1055,"line":2974},[1053,5486,5487],{"class":1066},"            elif",[1053,5489,1482],{"class":1481},[1053,5491,5492],{"class":1485},"user",[1053,5494,1489],{"class":1481},[1053,5496,1493],{"class":1492},[1053,5498,5308],{"class":1070},[1053,5500,1135],{"class":1096},[1053,5502,5503,5505,5507,5510,5513],{"class":1055,"line":2979},[1053,5504,5460],{"class":1070},[1053,5506,1521],{"class":1096},[1053,5508,5509],{"class":1481}," \"",[1053,5511,5512],{"class":1485},"user_service",[1053,5514,5436],{"class":1481},[1053,5516,5517,5519,5521,5524,5526,5528,5530],{"class":1055,"line":2987},[1053,5518,5487],{"class":1066},[1053,5520,1482],{"class":1481},[1053,5522,5523],{"class":1485},"product",[1053,5525,1489],{"class":1481},[1053,5527,1493],{"class":1492},[1053,5529,5308],{"class":1070},[1053,5531,1135],{"class":1096},[1053,5533,5534,5536,5538,5540,5543],{"class":1055,"line":2996},[1053,5535,5460],{"class":1070},[1053,5537,1521],{"class":1096},[1053,5539,5509],{"class":1481},[1053,5541,5542],{"class":1485},"product_service",[1053,5544,5436],{"class":1481},[1053,5546,5547,5549,5551,5554,5556,5558,5560],{"class":1055,"line":3003},[1053,5548,5487],{"class":1066},[1053,5550,1482],{"class":1481},[1053,5552,5553],{"class":1485},"order",[1053,5555,1489],{"class":1481},[1053,5557,1493],{"class":1492},[1053,5559,5308],{"class":1070},[1053,5561,1135],{"class":1096},[1053,5563,5564,5566,5568,5570,5573],{"class":1055,"line":3008},[1053,5565,5460],{"class":1070},[1053,5567,1521],{"class":1096},[1053,5569,5509],{"class":1481},[1053,5571,5572],{"class":1485},"order_service",[1053,5574,5436],{"class":1481},[1053,5576,5577],{"class":1055,"line":3026},[1053,5578,2245],{"class":1070},[1053,5580,5581,5584,5586,5588],{"class":1055,"line":3036},[1053,5582,5583],{"class":1070},"            recommendations",[1053,5585,1191],{"class":1096},[1053,5587,1591],{"class":1260},[1053,5589,2379],{"class":1096},[1053,5591,5592,5595,5598,5600,5602,5605],{"class":1055,"line":3048},[1053,5593,5594],{"class":1481},"                '",[1053,5596,5597],{"class":1485},"service_name",[1053,5599,1489],{"class":1481},[1053,5601,2393],{"class":1096},[1053,5603,5604],{"class":1260}," service_name",[1053,5606,2402],{"class":1096},[1053,5608,5609,5611,5613,5615,5617,5619],{"class":1055,"line":3070},[1053,5610,5594],{"class":1481},[1053,5612,1211],{"class":1485},[1053,5614,1489],{"class":1481},[1053,5616,2393],{"class":1096},[1053,5618,5308],{"class":1260},[1053,5620,2402],{"class":1096},[1053,5622,5623,5625,5627,5629,5631,5634],{"class":1055,"line":3134},[1053,5624,5594],{"class":1481},[1053,5626,3564],{"class":1485},[1053,5628,1489],{"class":1481},[1053,5630,2393],{"class":1096},[1053,5632,5633],{"class":1260}," total_models",[1053,5635,2402],{"class":1096},[1053,5637,5638,5640,5643,5645,5647,5650],{"class":1055,"line":3145},[1053,5639,5594],{"class":1481},[1053,5641,5642],{"class":1485},"total_complexity",[1053,5644,1489],{"class":1481},[1053,5646,2393],{"class":1096},[1053,5648,5649],{"class":1260}," total_complexity",[1053,5651,2402],{"class":1096},[1053,5653,5654,5656,5659,5661,5663,5666],{"class":1055,"line":3153},[1053,5655,5594],{"class":1481},[1053,5657,5658],{"class":1485},"average_coupling",[1053,5660,1489],{"class":1481},[1053,5662,2393],{"class":1096},[1053,5664,5665],{"class":1260}," avg_coupling",[1053,5667,2402],{"class":1096},[1053,5669,5670,5672,5675,5677,5679,5681,5683,5686],{"class":1055,"line":3158},[1053,5671,5594],{"class":1481},[1053,5673,5674],{"class":1485},"recommendation_score",[1053,5676,1489],{"class":1481},[1053,5678,2393],{"class":1096},[1053,5680,1396],{"class":1187},[1053,5682,1191],{"class":1096},[1053,5684,5685],{"class":1260},"_calculate_recommendation_score",[1053,5687,5688],{"class":1096},"(\n",[1053,5690,5691,5694,5696,5698,5700],{"class":1055,"line":3177},[1053,5692,5693],{"class":1260},"                    total_models",[1053,5695,1097],{"class":1096},[1053,5697,5649],{"class":1260},[1053,5699,1097],{"class":1096},[1053,5701,5702],{"class":1260}," avg_coupling\n",[1053,5704,5705],{"class":1055,"line":3187},[1053,5706,5707],{"class":1096},"                )\n",[1053,5709,5710],{"class":1055,"line":3200},[1053,5711,5712],{"class":1096},"            })\n",[1053,5714,5715],{"class":1055,"line":3205},[1053,5716,1387],{"class":1070},[1053,5718,5719],{"class":1055,"line":3212},[1053,5720,5721],{"class":1059},"        # Sort by recommendation score\n",[1053,5723,5724,5727,5729,5732,5734,5738,5740,5743,5746,5748,5750,5752,5754,5756,5758,5761,5764,5766,5770],{"class":1055,"line":3240},[1053,5725,5726],{"class":1070},"        recommendations",[1053,5728,1191],{"class":1096},[1053,5730,5731],{"class":1260},"sort",[1053,5733,1168],{"class":1096},[1053,5735,5737],{"class":5736},"sqOPj","key",[1053,5739,1521],{"class":1096},[1053,5741,5742],{"class":1127},"lambda",[1053,5744,5745],{"class":1177}," x",[1053,5747,2393],{"class":1096},[1053,5749,5745],{"class":1260},[1053,5751,1723],{"class":1096},[1053,5753,1489],{"class":1481},[1053,5755,5674],{"class":1485},[1053,5757,1489],{"class":1481},[1053,5759,5760],{"class":1096},"],",[1053,5762,5763],{"class":5736}," reverse",[1053,5765,1521],{"class":1096},[1053,5767,5769],{"class":5768},"s8XtY","True",[1053,5771,1269],{"class":1096},[1053,5773,5774],{"class":1055,"line":3256},[1053,5775,1387],{"class":1070},[1053,5777,5778,5780],{"class":1055,"line":3261},[1053,5779,1393],{"class":1066},[1053,5781,5782],{"class":1070}," recommendations\n",[1053,5784,5785],{"class":1055,"line":3280},[1053,5786,1155],{"class":1070},[1053,5788,5789,5791,5794,5796,5798,5800,5803,5805,5808,5810,5813],{"class":1055,"line":3285},[1053,5790,1161],{"class":1127},[1053,5792,5793],{"class":1302}," _calculate_recommendation_score",[1053,5795,1168],{"class":1096},[1053,5797,1172],{"class":1171},[1053,5799,1097],{"class":1096},[1053,5801,5802],{"class":1177}," models",[1053,5804,1097],{"class":1096},[1053,5806,5807],{"class":1177}," complexity",[1053,5809,1097],{"class":1096},[1053,5811,5812],{"class":1177}," coupling",[1053,5814,1181],{"class":1096},[1053,5816,5817,5819,5822],{"class":1055,"line":3306},[1053,5818,1315],{"class":1141},[1053,5820,5821],{"class":1145},"Calculate recommendation score for service boundary",[1053,5823,1149],{"class":1141},[1053,5825,5826],{"class":1055,"line":3328},[1053,5827,5828],{"class":1059},"        # Higher models and complexity, lower coupling = better service boundary\n",[1053,5830,5831,5833,5835,5838,5840,5843,5845,5847,5849,5851,5853,5856,5858,5861,5863,5866],{"class":1055,"line":3347},[1053,5832,1393],{"class":1066},[1053,5834,3084],{"class":1096},[1053,5836,5837],{"class":1070},"models ",[1053,5839,4435],{"class":1492},[1053,5841,5842],{"class":3044}," 0.4",[1053,5844,4441],{"class":1492},[1053,5846,4444],{"class":1070},[1053,5848,4435],{"class":1492},[1053,5850,5842],{"class":3044},[1053,5852,2168],{"class":1096},[1053,5854,5855],{"class":1492}," -",[1053,5857,3084],{"class":1096},[1053,5859,5860],{"class":1070},"coupling ",[1053,5862,4435],{"class":1492},[1053,5864,5865],{"class":3044}," 0.2",[1053,5867,1269],{"class":1096},[1053,5869,5870],{"class":1055,"line":3389},[1053,5871,1121],{"emptyLinePlaceholder":1120},[1053,5873,5874],{"class":1055,"line":3412},[1053,5875,3829],{"class":1059},[1053,5877,5878,5881,5883,5885,5887,5889],{"class":1055,"line":3426},[1053,5879,5880],{"class":1070},"boundary_identifier ",[1053,5882,1521],{"class":1096},[1053,5884,3980],{"class":1260},[1053,5886,1168],{"class":1096},[1053,5888,3893],{"class":1260},[1053,5890,1269],{"class":1096},[1053,5892,5893,5896,5898,5901,5903,5906],{"class":1055,"line":3461},[1053,5894,5895],{"class":1070},"recommendations ",[1053,5897,1521],{"class":1096},[1053,5899,5900],{"class":1070}," boundary_identifier",[1053,5902,1191],{"class":1096},[1053,5904,5905],{"class":1260},"identify_boundaries",[1053,5907,1333],{"class":1096},[1053,5909,5910],{"class":1055,"line":3466},[1053,5911,1121],{"emptyLinePlaceholder":1120},[1053,5913,5914,5917,5920,5922,5925],{"class":1055,"line":3483},[1053,5915,5916],{"class":1066},"for",[1053,5918,5919],{"class":1070}," rec ",[1053,5921,1454],{"class":1066},[1053,5923,5924],{"class":1070}," recommendations",[1053,5926,1135],{"class":1096},[1053,5928,5929,5932,5934,5936,5939,5941,5944,5946,5948,5950,5952,5954,5956,5958],{"class":1055,"line":3489},[1053,5930,5931],{"class":1164},"    print",[1053,5933,1168],{"class":1096},[1053,5935,3879],{"class":1127},[1053,5937,5938],{"class":1485},"\"Service: ",[1053,5940,3886],{"class":3885},[1053,5942,5943],{"class":1260},"rec",[1053,5945,1723],{"class":1096},[1053,5947,1489],{"class":1481},[1053,5949,5597],{"class":1485},[1053,5951,1489],{"class":1481},[1053,5953,1729],{"class":1096},[1053,5955,3907],{"class":3885},[1053,5957,5467],{"class":1485},[1053,5959,1269],{"class":1096},[1053,5961,5962,5964,5966,5968,5971,5973,5975,5977,5979,5981,5983,5985,5987,5989],{"class":1055,"line":3494},[1053,5963,5931],{"class":1164},[1053,5965,1168],{"class":1096},[1053,5967,3879],{"class":1127},[1053,5969,5970],{"class":1485},"\"Apps: ",[1053,5972,3886],{"class":3885},[1053,5974,5943],{"class":1260},[1053,5976,1723],{"class":1096},[1053,5978,1489],{"class":1481},[1053,5980,1211],{"class":1485},[1053,5982,1489],{"class":1481},[1053,5984,1729],{"class":1096},[1053,5986,3907],{"class":3885},[1053,5988,5467],{"class":1485},[1053,5990,1269],{"class":1096},[1053,5992,5993,5995,5997,5999,6002,6004,6006,6008,6010,6012,6014,6016,6019,6021,6023],{"class":1055,"line":3502},[1053,5994,5931],{"class":1164},[1053,5996,1168],{"class":1096},[1053,5998,3879],{"class":1127},[1053,6000,6001],{"class":1485},"\"Score: ",[1053,6003,3886],{"class":3885},[1053,6005,5943],{"class":1260},[1053,6007,1723],{"class":1096},[1053,6009,1489],{"class":1481},[1053,6011,5674],{"class":1485},[1053,6013,1489],{"class":1481},[1053,6015,1729],{"class":1096},[1053,6017,6018],{"class":1127},":.2f",[1053,6020,3907],{"class":3885},[1053,6022,5467],{"class":1485},[1053,6024,1269],{"class":1096},[1053,6026,6027,6029,6031,6033,6036,6038],{"class":1055,"line":3507},[1053,6028,5931],{"class":1164},[1053,6030,1168],{"class":1096},[1053,6032,5467],{"class":1481},[1053,6034,6035],{"class":1485},"---",[1053,6037,5467],{"class":1481},[1053,6039,1269],{"class":1096},[1030,6041,6043],{"id":6042},"migration-strategies","Migration Strategies",[1035,6045,6047],{"id":6046},"_1-strangler-fig-pattern","1. Strangler Fig Pattern",[1026,6049,6050],{},"Gradually replace monolith functionality:",[1043,6052,6054],{"className":1045,"code":6053,"language":1047,"meta":1048,"style":1048},"# strangler_fig.py\nfrom django.http import HttpResponse, HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.conf import settings\nimport requests\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass StranglerFigMiddleware:\n    \"\"\"Middleware to gradually route requests to microservices\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.migration_config = getattr(settings, 'MICROSERVICE_MIGRATION', {})\n    \n    def __call__(self, request):\n        # Check if this request should be routed to a microservice\n        microservice_url = self._should_route_to_microservice(request)\n        \n        if microservice_url:\n            return self._proxy_to_microservice(request, microservice_url)\n        \n        # Continue with monolith\n        return self.get_response(request)\n    \n    def _should_route_to_microservice(self, request):\n        \"\"\"Determine if request should be routed to microservice\"\"\"\n        path = request.path\n        \n        for pattern, config in self.migration_config.items():\n            if path.startswith(pattern):\n                # Check migration percentage\n                import random\n                if random.randint(1, 100) \u003C= config.get('percentage', 0):\n                    return config.get('service_url')\n        \n        return None\n    \n    def _proxy_to_microservice(self, request, service_url):\n        \"\"\"Proxy request to microservice\"\"\"\n        try:\n            # Prepare request\n            url = f\"{service_url.rstrip('/')}{request.path}\"\n            headers = self._prepare_headers(request)\n            \n            # Make request to microservice\n            if request.method == 'GET':\n                response = requests.get(url, params=request.GET, headers=headers)\n            elif request.method == 'POST':\n                response = requests.post(url, data=request.POST, headers=headers)\n            elif request.method == 'PUT':\n                response = requests.put(url, data=request.body, headers=headers)\n            elif request.method == 'DELETE':\n                response = requests.delete(url, headers=headers)\n            else:\n                # Fallback to monolith for unsupported methods\n                return self.get_response(request)\n            \n            # Return microservice response\n            django_response = HttpResponse(\n                response.content,\n                status=response.status_code,\n                content_type=response.headers.get('content-type', 'text/html')\n            )\n            \n            # Copy relevant headers\n            for header, value in response.headers.items():\n                if header.lower() not in ['content-length', 'transfer-encoding']:\n                    django_response[header] = value\n            \n            logger.info(f\"Proxied {request.method} {request.path} to microservice\")\n            return django_response\n            \n        except requests.RequestException as e:\n            logger.error(f\"Error proxying to microservice: {e}\")\n            # Fallback to monolith\n            return self.get_response(request)\n    \n    def _prepare_headers(self, request):\n        \"\"\"Prepare headers for microservice request\"\"\"\n        headers = {}\n        \n        # Copy relevant headers\n        for header, value in request.META.items():\n            if header.startswith('HTTP_'):\n                header_name = header[5:].replace('_', '-').title()\n                headers[header_name] = value\n        \n        # Add service authentication\n        headers['X-Service-Token'] = settings.SERVICE_SECRET_TOKEN\n        headers['X-Original-Host'] = request.get_host()\n        \n        return headers\n\n# Migration configuration example\n# settings.py\nMICROSERVICE_MIGRATION = {\n    '/api/users/': {\n        'service_url': 'http://user-service:8000',\n        'percentage': 10  # Route 10% of traffic\n    },\n    '/api/products/': {\n        'service_url': 'http://product-service:8000',\n        'percentage': 25  # Route 25% of traffic\n    }\n}\n",[1050,6055,6056,6061,6083,6099,6115,6122,6129,6133,6156,6160,6169,6178,6182,6199,6213,6246,6250,6268,6273,6294,6298,6308,6329,6333,6338,6354,6358,6375,6384,6398,6402,6428,6447,6452,6460,6509,6531,6535,6542,6546,6568,6577,6583,6588,6632,6652,6656,6661,6683,6728,6749,6789,6810,6849,6870,6897,6904,6909,6926,6930,6935,6946,6957,6974,7011,7016,7020,7025,7052,7091,7108,7112,7155,7162,7166,7184,7211,7216,7232,7236,7253,7262,7271,7275,7280,7305,7326,7372,7388,7392,7397,7423,7449,7453,7460,7464,7469,7474,7482,7496,7516,7532,7537,7550,7569,7585,7590],{"__ignoreMap":1048},[1053,6057,6058],{"class":1055,"line":1056},[1053,6059,6060],{"class":1059},"# strangler_fig.py\n",[1053,6062,6063,6065,6068,6070,6073,6075,6078,6080],{"class":1055,"line":1063},[1053,6064,1085],{"class":1066},[1053,6066,6067],{"class":1070}," django",[1053,6069,1191],{"class":1096},[1053,6071,6072],{"class":1070},"http ",[1053,6074,1067],{"class":1066},[1053,6076,6077],{"class":1070}," HttpResponse",[1053,6079,1097],{"class":1096},[1053,6081,6082],{"class":1070}," HttpResponseRedirect\n",[1053,6084,6085,6087,6089,6091,6094,6096],{"class":1055,"line":1074},[1053,6086,1085],{"class":1066},[1053,6088,6067],{"class":1070},[1053,6090,1191],{"class":1096},[1053,6092,6093],{"class":1070},"urls ",[1053,6095,1067],{"class":1066},[1053,6097,6098],{"class":1070}," reverse\n",[1053,6100,6101,6103,6105,6107,6110,6112],{"class":1055,"line":1082},[1053,6102,1085],{"class":1066},[1053,6104,6067],{"class":1070},[1053,6106,1191],{"class":1096},[1053,6108,6109],{"class":1070},"conf ",[1053,6111,1067],{"class":1066},[1053,6113,6114],{"class":1070}," settings\n",[1053,6116,6117,6119],{"class":1055,"line":1103},[1053,6118,1067],{"class":1066},[1053,6120,6121],{"class":1070}," requests\n",[1053,6123,6124,6126],{"class":1055,"line":1117},[1053,6125,1067],{"class":1066},[1053,6127,6128],{"class":1070}," logging\n",[1053,6130,6131],{"class":1055,"line":1124},[1053,6132,1121],{"emptyLinePlaceholder":1120},[1053,6134,6135,6138,6140,6143,6145,6148,6150,6154],{"class":1055,"line":1138},[1053,6136,6137],{"class":1070},"logger ",[1053,6139,1521],{"class":1096},[1053,6141,6142],{"class":1070}," logging",[1053,6144,1191],{"class":1096},[1053,6146,6147],{"class":1260},"getLogger",[1053,6149,1168],{"class":1096},[1053,6151,6153],{"class":6152},"s131V","__name__",[1053,6155,1269],{"class":1096},[1053,6157,6158],{"class":1055,"line":1152},[1053,6159,1121],{"emptyLinePlaceholder":1120},[1053,6161,6162,6164,6167],{"class":1055,"line":1158},[1053,6163,1128],{"class":1127},[1053,6165,6166],{"class":1131}," StranglerFigMiddleware",[1053,6168,1135],{"class":1096},[1053,6170,6171,6173,6176],{"class":1055,"line":1184},[1053,6172,1142],{"class":1141},[1053,6174,6175],{"class":1145},"Middleware to gradually route requests to microservices",[1053,6177,1149],{"class":1141},[1053,6179,6180],{"class":1055,"line":1204},[1053,6181,1155],{"class":1070},[1053,6183,6184,6186,6188,6190,6192,6194,6197],{"class":1055,"line":1219},[1053,6185,1161],{"class":1127},[1053,6187,1165],{"class":1164},[1053,6189,1168],{"class":1096},[1053,6191,1172],{"class":1171},[1053,6193,1097],{"class":1096},[1053,6195,6196],{"class":1177}," get_response",[1053,6198,1181],{"class":1096},[1053,6200,6201,6203,6205,6208,6210],{"class":1055,"line":1234},[1053,6202,1188],{"class":1187},[1053,6204,1191],{"class":1096},[1053,6206,6207],{"class":1194},"get_response",[1053,6209,1198],{"class":1096},[1053,6211,6212],{"class":1070}," get_response\n",[1053,6214,6215,6217,6219,6222,6224,6227,6229,6232,6234,6236,6239,6241,6243],{"class":1055,"line":1248},[1053,6216,1188],{"class":1187},[1053,6218,1191],{"class":1096},[1053,6220,6221],{"class":1194},"migration_config",[1053,6223,1198],{"class":1096},[1053,6225,6226],{"class":1164}," getattr",[1053,6228,1168],{"class":1096},[1053,6230,6231],{"class":1260},"settings",[1053,6233,1097],{"class":1096},[1053,6235,1482],{"class":1481},[1053,6237,6238],{"class":1485},"MICROSERVICE_MIGRATION",[1053,6240,1489],{"class":1481},[1053,6242,1097],{"class":1096},[1053,6244,6245],{"class":1096}," {})\n",[1053,6247,6248],{"class":1055,"line":1272},[1053,6249,1155],{"class":1070},[1053,6251,6252,6254,6257,6259,6261,6263,6266],{"class":1055,"line":1292},[1053,6253,1161],{"class":1127},[1053,6255,6256],{"class":1164}," __call__",[1053,6258,1168],{"class":1096},[1053,6260,1172],{"class":1171},[1053,6262,1097],{"class":1096},[1053,6264,6265],{"class":1177}," request",[1053,6267,1181],{"class":1096},[1053,6269,6270],{"class":1055,"line":1297},[1053,6271,6272],{"class":1059},"        # Check if this request should be routed to a microservice\n",[1053,6274,6275,6278,6280,6282,6284,6287,6289,6292],{"class":1055,"line":1312},[1053,6276,6277],{"class":1070},"        microservice_url ",[1053,6279,1521],{"class":1096},[1053,6281,1396],{"class":1187},[1053,6283,1191],{"class":1096},[1053,6285,6286],{"class":1260},"_should_route_to_microservice",[1053,6288,1168],{"class":1096},[1053,6290,6291],{"class":1260},"request",[1053,6293,1269],{"class":1096},[1053,6295,6296],{"class":1055,"line":1323},[1053,6297,1387],{"class":1070},[1053,6299,6300,6303,6306],{"class":1055,"line":1336},[1053,6301,6302],{"class":1066},"        if",[1053,6304,6305],{"class":1070}," microservice_url",[1053,6307,1135],{"class":1096},[1053,6309,6310,6312,6314,6316,6319,6321,6323,6325,6327],{"class":1055,"line":1348},[1053,6311,2502],{"class":1066},[1053,6313,1396],{"class":1187},[1053,6315,1191],{"class":1096},[1053,6317,6318],{"class":1260},"_proxy_to_microservice",[1053,6320,1168],{"class":1096},[1053,6322,6291],{"class":1260},[1053,6324,1097],{"class":1096},[1053,6326,6305],{"class":1260},[1053,6328,1269],{"class":1096},[1053,6330,6331],{"class":1055,"line":1360},[1053,6332,1387],{"class":1070},[1053,6334,6335],{"class":1055,"line":1372},[1053,6336,6337],{"class":1059},"        # Continue with monolith\n",[1053,6339,6340,6342,6344,6346,6348,6350,6352],{"class":1055,"line":1384},[1053,6341,1393],{"class":1066},[1053,6343,1396],{"class":1187},[1053,6345,1191],{"class":1096},[1053,6347,6207],{"class":1260},[1053,6349,1168],{"class":1096},[1053,6351,6291],{"class":1260},[1053,6353,1269],{"class":1096},[1053,6355,6356],{"class":1055,"line":1390},[1053,6357,1155],{"class":1070},[1053,6359,6360,6362,6365,6367,6369,6371,6373],{"class":1055,"line":1406},[1053,6361,1161],{"class":1127},[1053,6363,6364],{"class":1302}," _should_route_to_microservice",[1053,6366,1168],{"class":1096},[1053,6368,1172],{"class":1171},[1053,6370,1097],{"class":1096},[1053,6372,6265],{"class":1177},[1053,6374,1181],{"class":1096},[1053,6376,6377,6379,6382],{"class":1055,"line":1411},[1053,6378,1315],{"class":1141},[1053,6380,6381],{"class":1145},"Determine if request should be routed to microservice",[1053,6383,1149],{"class":1141},[1053,6385,6386,6389,6391,6393,6395],{"class":1055,"line":1425},[1053,6387,6388],{"class":1070},"        path ",[1053,6390,1521],{"class":1096},[1053,6392,6265],{"class":1070},[1053,6394,1191],{"class":1096},[1053,6396,6397],{"class":1194},"path\n",[1053,6399,6400],{"class":1055,"line":1435},[1053,6401,1387],{"class":1070},[1053,6403,6404,6406,6409,6411,6414,6416,6418,6420,6422,6424,6426],{"class":1055,"line":1475},[1053,6405,1438],{"class":1066},[1053,6407,6408],{"class":1070}," pattern",[1053,6410,1097],{"class":1096},[1053,6412,6413],{"class":1070}," config ",[1053,6415,1454],{"class":1066},[1053,6417,1396],{"class":1187},[1053,6419,1191],{"class":1096},[1053,6421,6221],{"class":1194},[1053,6423,1191],{"class":1096},[1053,6425,3746],{"class":1260},[1053,6427,4219],{"class":1096},[1053,6429,6430,6432,6435,6437,6440,6442,6445],{"class":1055,"line":1515},[1053,6431,1478],{"class":1066},[1053,6433,6434],{"class":1070}," path",[1053,6436,1191],{"class":1096},[1053,6438,6439],{"class":1260},"startswith",[1053,6441,1168],{"class":1096},[1053,6443,6444],{"class":1260},"pattern",[1053,6446,1181],{"class":1096},[1053,6448,6449],{"class":1055,"line":1543},[1053,6450,6451],{"class":1059},"                # Check migration percentage\n",[1053,6453,6454,6457],{"class":1055,"line":1579},[1053,6455,6456],{"class":1066},"                import",[1053,6458,6459],{"class":1070}," random\n",[1053,6461,6462,6464,6467,6469,6472,6474,6477,6479,6482,6484,6487,6490,6492,6494,6496,6498,6501,6503,6505,6507],{"class":1055,"line":1601},[1053,6463,1546],{"class":1066},[1053,6465,6466],{"class":1070}," random",[1053,6468,1191],{"class":1096},[1053,6470,6471],{"class":1260},"randint",[1053,6473,1168],{"class":1096},[1053,6475,6476],{"class":3044},"1",[1053,6478,1097],{"class":1096},[1053,6480,6481],{"class":3044}," 100",[1053,6483,2168],{"class":1096},[1053,6485,6486],{"class":1492}," \u003C=",[1053,6488,6489],{"class":1070}," config",[1053,6491,1191],{"class":1096},[1053,6493,4357],{"class":1260},[1053,6495,1168],{"class":1096},[1053,6497,1489],{"class":1481},[1053,6499,6500],{"class":1485},"percentage",[1053,6502,1489],{"class":1481},[1053,6504,1097],{"class":1096},[1053,6506,4366],{"class":3044},[1053,6508,1181],{"class":1096},[1053,6510,6511,6514,6516,6518,6520,6522,6524,6527,6529],{"class":1055,"line":1606},[1053,6512,6513],{"class":1066},"                    return",[1053,6515,6489],{"class":1070},[1053,6517,1191],{"class":1096},[1053,6519,4357],{"class":1260},[1053,6521,1168],{"class":1096},[1053,6523,1489],{"class":1481},[1053,6525,6526],{"class":1485},"service_url",[1053,6528,1489],{"class":1481},[1053,6530,1269],{"class":1096},[1053,6532,6533],{"class":1055,"line":1620},[1053,6534,1387],{"class":1070},[1053,6536,6537,6539],{"class":1055,"line":1630},[1053,6538,1393],{"class":1066},[1053,6540,6541],{"class":5768}," None\n",[1053,6543,6544],{"class":1055,"line":1648},[1053,6545,1155],{"class":1070},[1053,6547,6548,6550,6553,6555,6557,6559,6561,6563,6566],{"class":1055,"line":1690},[1053,6549,1161],{"class":1127},[1053,6551,6552],{"class":1302}," _proxy_to_microservice",[1053,6554,1168],{"class":1096},[1053,6556,1172],{"class":1171},[1053,6558,1097],{"class":1096},[1053,6560,6265],{"class":1177},[1053,6562,1097],{"class":1096},[1053,6564,6565],{"class":1177}," service_url",[1053,6567,1181],{"class":1096},[1053,6569,6570,6572,6575],{"class":1055,"line":1713},[1053,6571,1315],{"class":1141},[1053,6573,6574],{"class":1145},"Proxy request to microservice",[1053,6576,1149],{"class":1141},[1053,6578,6579,6581],{"class":1055,"line":1747},[1053,6580,2204],{"class":1066},[1053,6582,1135],{"class":1096},[1053,6584,6585],{"class":1055,"line":1752},[1053,6586,6587],{"class":1059},"            # Prepare request\n",[1053,6589,6590,6593,6595,6597,6599,6601,6603,6605,6608,6610,6612,6615,6617,6619,6622,6624,6626,6628,6630],{"class":1055,"line":1766},[1053,6591,6592],{"class":1070},"            url ",[1053,6594,1521],{"class":1096},[1053,6596,2174],{"class":1127},[1053,6598,5467],{"class":1485},[1053,6600,3886],{"class":3885},[1053,6602,6526],{"class":1070},[1053,6604,1191],{"class":1096},[1053,6606,6607],{"class":1260},"rstrip",[1053,6609,1168],{"class":1096},[1053,6611,1489],{"class":1481},[1053,6613,6614],{"class":1485},"/",[1053,6616,1489],{"class":1481},[1053,6618,2168],{"class":1096},[1053,6620,6621],{"class":3885},"}{",[1053,6623,6291],{"class":1070},[1053,6625,1191],{"class":1096},[1053,6627,1528],{"class":1194},[1053,6629,3907],{"class":3885},[1053,6631,5436],{"class":1485},[1053,6633,6634,6637,6639,6641,6643,6646,6648,6650],{"class":1055,"line":1776},[1053,6635,6636],{"class":1070},"            headers ",[1053,6638,1521],{"class":1096},[1053,6640,1396],{"class":1187},[1053,6642,1191],{"class":1096},[1053,6644,6645],{"class":1260},"_prepare_headers",[1053,6647,1168],{"class":1096},[1053,6649,6291],{"class":1260},[1053,6651,1269],{"class":1096},[1053,6653,6654],{"class":1055,"line":1793},[1053,6655,2245],{"class":1070},[1053,6657,6658],{"class":1055,"line":1834},[1053,6659,6660],{"class":1059},"            # Make request to microservice\n",[1053,6662,6663,6665,6667,6669,6672,6674,6676,6679,6681],{"class":1055,"line":1856},[1053,6664,1478],{"class":1066},[1053,6666,6265],{"class":1070},[1053,6668,1191],{"class":1096},[1053,6670,6671],{"class":1194},"method",[1053,6673,2357],{"class":1492},[1053,6675,1482],{"class":1481},[1053,6677,6678],{"class":1485},"GET",[1053,6680,1489],{"class":1481},[1053,6682,1135],{"class":1096},[1053,6684,6685,6688,6690,6693,6695,6697,6699,6702,6704,6707,6709,6711,6713,6716,6718,6721,6723,6726],{"class":1055,"line":1886},[1053,6686,6687],{"class":1070},"                response ",[1053,6689,1521],{"class":1096},[1053,6691,6692],{"class":1070}," requests",[1053,6694,1191],{"class":1096},[1053,6696,4357],{"class":1260},[1053,6698,1168],{"class":1096},[1053,6700,6701],{"class":1260},"url",[1053,6703,1097],{"class":1096},[1053,6705,6706],{"class":5736}," params",[1053,6708,1521],{"class":1096},[1053,6710,6291],{"class":1260},[1053,6712,1191],{"class":1096},[1053,6714,6678],{"class":6715},"sFGJz",[1053,6717,1097],{"class":1096},[1053,6719,6720],{"class":5736}," headers",[1053,6722,1521],{"class":1096},[1053,6724,6725],{"class":1260},"headers",[1053,6727,1269],{"class":1096},[1053,6729,6730,6732,6734,6736,6738,6740,6742,6745,6747],{"class":1055,"line":1891},[1053,6731,5487],{"class":1066},[1053,6733,6265],{"class":1070},[1053,6735,1191],{"class":1096},[1053,6737,6671],{"class":1194},[1053,6739,2357],{"class":1492},[1053,6741,1482],{"class":1481},[1053,6743,6744],{"class":1485},"POST",[1053,6746,1489],{"class":1481},[1053,6748,1135],{"class":1096},[1053,6750,6751,6753,6755,6757,6759,6762,6764,6766,6768,6771,6773,6775,6777,6779,6781,6783,6785,6787],{"class":1055,"line":1905},[1053,6752,6687],{"class":1070},[1053,6754,1521],{"class":1096},[1053,6756,6692],{"class":1070},[1053,6758,1191],{"class":1096},[1053,6760,6761],{"class":1260},"post",[1053,6763,1168],{"class":1096},[1053,6765,6701],{"class":1260},[1053,6767,1097],{"class":1096},[1053,6769,6770],{"class":5736}," data",[1053,6772,1521],{"class":1096},[1053,6774,6291],{"class":1260},[1053,6776,1191],{"class":1096},[1053,6778,6744],{"class":6715},[1053,6780,1097],{"class":1096},[1053,6782,6720],{"class":5736},[1053,6784,1521],{"class":1096},[1053,6786,6725],{"class":1260},[1053,6788,1269],{"class":1096},[1053,6790,6791,6793,6795,6797,6799,6801,6803,6806,6808],{"class":1055,"line":1915},[1053,6792,5487],{"class":1066},[1053,6794,6265],{"class":1070},[1053,6796,1191],{"class":1096},[1053,6798,6671],{"class":1194},[1053,6800,2357],{"class":1492},[1053,6802,1482],{"class":1481},[1053,6804,6805],{"class":1485},"PUT",[1053,6807,1489],{"class":1481},[1053,6809,1135],{"class":1096},[1053,6811,6812,6814,6816,6818,6820,6823,6825,6827,6829,6831,6833,6835,6837,6839,6841,6843,6845,6847],{"class":1055,"line":1932},[1053,6813,6687],{"class":1070},[1053,6815,1521],{"class":1096},[1053,6817,6692],{"class":1070},[1053,6819,1191],{"class":1096},[1053,6821,6822],{"class":1260},"put",[1053,6824,1168],{"class":1096},[1053,6826,6701],{"class":1260},[1053,6828,1097],{"class":1096},[1053,6830,6770],{"class":5736},[1053,6832,1521],{"class":1096},[1053,6834,6291],{"class":1260},[1053,6836,1191],{"class":1096},[1053,6838,2464],{"class":1194},[1053,6840,1097],{"class":1096},[1053,6842,6720],{"class":5736},[1053,6844,1521],{"class":1096},[1053,6846,6725],{"class":1260},[1053,6848,1269],{"class":1096},[1053,6850,6851,6853,6855,6857,6859,6861,6863,6866,6868],{"class":1055,"line":1964},[1053,6852,5487],{"class":1066},[1053,6854,6265],{"class":1070},[1053,6856,1191],{"class":1096},[1053,6858,6671],{"class":1194},[1053,6860,2357],{"class":1492},[1053,6862,1482],{"class":1481},[1053,6864,6865],{"class":1485},"DELETE",[1053,6867,1489],{"class":1481},[1053,6869,1135],{"class":1096},[1053,6871,6872,6874,6876,6878,6880,6883,6885,6887,6889,6891,6893,6895],{"class":1055,"line":1995},[1053,6873,6687],{"class":1070},[1053,6875,1521],{"class":1096},[1053,6877,6692],{"class":1070},[1053,6879,1191],{"class":1096},[1053,6881,6882],{"class":1260},"delete",[1053,6884,1168],{"class":1096},[1053,6886,6701],{"class":1260},[1053,6888,1097],{"class":1096},[1053,6890,6720],{"class":5736},[1053,6892,1521],{"class":1096},[1053,6894,6725],{"class":1260},[1053,6896,1269],{"class":1096},[1053,6898,6899,6902],{"class":1055,"line":2011},[1053,6900,6901],{"class":1066},"            else",[1053,6903,1135],{"class":1096},[1053,6905,6906],{"class":1055,"line":2035},[1053,6907,6908],{"class":1059},"                # Fallback to monolith for unsupported methods\n",[1053,6910,6911,6914,6916,6918,6920,6922,6924],{"class":1055,"line":2063},[1053,6912,6913],{"class":1066},"                return",[1053,6915,1396],{"class":1187},[1053,6917,1191],{"class":1096},[1053,6919,6207],{"class":1260},[1053,6921,1168],{"class":1096},[1053,6923,6291],{"class":1260},[1053,6925,1269],{"class":1096},[1053,6927,6928],{"class":1055,"line":2085},[1053,6929,2245],{"class":1070},[1053,6931,6932],{"class":1055,"line":2112},[1053,6933,6934],{"class":1059},"            # Return microservice response\n",[1053,6936,6937,6940,6942,6944],{"class":1055,"line":2117},[1053,6938,6939],{"class":1070},"            django_response ",[1053,6941,1521],{"class":1096},[1053,6943,6077],{"class":1260},[1053,6945,5688],{"class":1096},[1053,6947,6948,6951,6953,6955],{"class":1055,"line":2136},[1053,6949,6950],{"class":1260},"                response",[1053,6952,1191],{"class":1096},[1053,6954,2227],{"class":1194},[1053,6956,2402],{"class":1096},[1053,6958,6959,6962,6964,6967,6969,6972],{"class":1055,"line":2146},[1053,6960,6961],{"class":5736},"                status",[1053,6963,1521],{"class":1096},[1053,6965,6966],{"class":1260},"response",[1053,6968,1191],{"class":1096},[1053,6970,6971],{"class":1194},"status_code",[1053,6973,2402],{"class":1096},[1053,6975,6976,6979,6981,6983,6985,6987,6989,6991,6993,6995,6998,7000,7002,7004,7007,7009],{"class":1055,"line":2179},[1053,6977,6978],{"class":5736},"                content_type",[1053,6980,1521],{"class":1096},[1053,6982,6966],{"class":1260},[1053,6984,1191],{"class":1096},[1053,6986,6725],{"class":1194},[1053,6988,1191],{"class":1096},[1053,6990,4357],{"class":1260},[1053,6992,1168],{"class":1096},[1053,6994,1489],{"class":1481},[1053,6996,6997],{"class":1485},"content-type",[1053,6999,1489],{"class":1481},[1053,7001,1097],{"class":1096},[1053,7003,1482],{"class":1481},[1053,7005,7006],{"class":1485},"text/html",[1053,7008,1489],{"class":1481},[1053,7010,1269],{"class":1096},[1053,7012,7013],{"class":1055,"line":2196},[1053,7014,7015],{"class":1096},"            )\n",[1053,7017,7018],{"class":1055,"line":2201},[1053,7019,2245],{"class":1070},[1053,7021,7022],{"class":1055,"line":2209},[1053,7023,7024],{"class":1059},"            # Copy relevant headers\n",[1053,7026,7027,7029,7032,7034,7037,7039,7042,7044,7046,7048,7050],{"class":1055,"line":2232},[1053,7028,1967],{"class":1066},[1053,7030,7031],{"class":1070}," header",[1053,7033,1097],{"class":1096},[1053,7035,7036],{"class":1070}," value ",[1053,7038,1454],{"class":1066},[1053,7040,7041],{"class":1070}," response",[1053,7043,1191],{"class":1096},[1053,7045,6725],{"class":1194},[1053,7047,1191],{"class":1096},[1053,7049,3746],{"class":1260},[1053,7051,4219],{"class":1096},[1053,7053,7054,7056,7058,7060,7063,7066,7069,7071,7073,7075,7078,7080,7082,7084,7087,7089],{"class":1055,"line":2242},[1053,7055,1546],{"class":1066},[1053,7057,7031],{"class":1070},[1053,7059,1191],{"class":1096},[1053,7061,7062],{"class":1260},"lower",[1053,7064,7065],{"class":1096},"()",[1053,7067,7068],{"class":1492}," not",[1053,7070,1493],{"class":1492},[1053,7072,1557],{"class":1096},[1053,7074,1489],{"class":1481},[1053,7076,7077],{"class":1485},"content-length",[1053,7079,1489],{"class":1481},[1053,7081,1097],{"class":1096},[1053,7083,1482],{"class":1481},[1053,7085,7086],{"class":1485},"transfer-encoding",[1053,7088,1489],{"class":1481},[1053,7090,1576],{"class":1096},[1053,7092,7093,7096,7098,7101,7103,7105],{"class":1055,"line":2248},[1053,7094,7095],{"class":1070},"                    django_response",[1053,7097,1723],{"class":1096},[1053,7099,7100],{"class":1070},"header",[1053,7102,1729],{"class":1096},[1053,7104,1198],{"class":1096},[1053,7106,7107],{"class":1070}," value\n",[1053,7109,7110],{"class":1055,"line":2271},[1053,7111,2245],{"class":1070},[1053,7113,7114,7117,7119,7122,7124,7126,7129,7131,7133,7135,7137,7139,7142,7144,7146,7148,7150,7153],{"class":1055,"line":2295},[1053,7115,7116],{"class":1070},"            logger",[1053,7118,1191],{"class":1096},[1053,7120,7121],{"class":1260},"info",[1053,7123,1168],{"class":1096},[1053,7125,3879],{"class":1127},[1053,7127,7128],{"class":1485},"\"Proxied ",[1053,7130,3886],{"class":3885},[1053,7132,6291],{"class":1260},[1053,7134,1191],{"class":1096},[1053,7136,6671],{"class":1194},[1053,7138,3907],{"class":3885},[1053,7140,7141],{"class":3885}," {",[1053,7143,6291],{"class":1260},[1053,7145,1191],{"class":1096},[1053,7147,1528],{"class":1194},[1053,7149,3907],{"class":3885},[1053,7151,7152],{"class":1485}," to microservice\"",[1053,7154,1269],{"class":1096},[1053,7156,7157,7159],{"class":1055,"line":2301},[1053,7158,2502],{"class":1066},[1053,7160,7161],{"class":1070}," django_response\n",[1053,7163,7164],{"class":1055,"line":2322},[1053,7165,2245],{"class":1070},[1053,7167,7168,7170,7172,7174,7177,7179,7182],{"class":1055,"line":2369},[1053,7169,2511],{"class":1066},[1053,7171,6692],{"class":1070},[1053,7173,1191],{"class":1096},[1053,7175,7176],{"class":1194},"RequestException",[1053,7178,2171],{"class":1066},[1053,7180,7181],{"class":1070}," e",[1053,7183,1135],{"class":1096},[1053,7185,7186,7188,7190,7193,7195,7197,7200,7202,7205,7207,7209],{"class":1055,"line":2382},[1053,7187,7116],{"class":1070},[1053,7189,1191],{"class":1096},[1053,7191,7192],{"class":1260},"error",[1053,7194,1168],{"class":1096},[1053,7196,3879],{"class":1127},[1053,7198,7199],{"class":1485},"\"Error proxying to microservice: ",[1053,7201,3886],{"class":3885},[1053,7203,7204],{"class":1260},"e",[1053,7206,3907],{"class":3885},[1053,7208,5467],{"class":1485},[1053,7210,1269],{"class":1096},[1053,7212,7213],{"class":1055,"line":2405},[1053,7214,7215],{"class":1059},"            # Fallback to monolith\n",[1053,7217,7218,7220,7222,7224,7226,7228,7230],{"class":1055,"line":2431},[1053,7219,2502],{"class":1066},[1053,7221,1396],{"class":1187},[1053,7223,1191],{"class":1096},[1053,7225,6207],{"class":1260},[1053,7227,1168],{"class":1096},[1053,7229,6291],{"class":1260},[1053,7231,1269],{"class":1096},[1053,7233,7234],{"class":1055,"line":2488},[1053,7235,1155],{"class":1070},[1053,7237,7238,7240,7243,7245,7247,7249,7251],{"class":1055,"line":2494},[1053,7239,1161],{"class":1127},[1053,7241,7242],{"class":1302}," _prepare_headers",[1053,7244,1168],{"class":1096},[1053,7246,1172],{"class":1171},[1053,7248,1097],{"class":1096},[1053,7250,6265],{"class":1177},[1053,7252,1181],{"class":1096},[1053,7254,7255,7257,7260],{"class":1055,"line":2499},[1053,7256,1315],{"class":1141},[1053,7258,7259],{"class":1145},"Prepare headers for microservice request",[1053,7261,1149],{"class":1141},[1053,7263,7264,7267,7269],{"class":1055,"line":2508},[1053,7265,7266],{"class":1070},"        headers ",[1053,7268,1521],{"class":1096},[1053,7270,1231],{"class":1096},[1053,7272,7273],{"class":1055,"line":2519},[1053,7274,1387],{"class":1070},[1053,7276,7277],{"class":1055,"line":2526},[1053,7278,7279],{"class":1059},"        # Copy relevant headers\n",[1053,7281,7282,7284,7286,7288,7290,7292,7294,7296,7299,7301,7303],{"class":1055,"line":2531},[1053,7283,1438],{"class":1066},[1053,7285,7031],{"class":1070},[1053,7287,1097],{"class":1096},[1053,7289,7036],{"class":1070},[1053,7291,1454],{"class":1066},[1053,7293,6265],{"class":1070},[1053,7295,1191],{"class":1096},[1053,7297,7298],{"class":6715},"META",[1053,7300,1191],{"class":1096},[1053,7302,3746],{"class":1260},[1053,7304,4219],{"class":1096},[1053,7306,7307,7309,7311,7313,7315,7317,7319,7322,7324],{"class":1055,"line":2550},[1053,7308,1478],{"class":1066},[1053,7310,7031],{"class":1070},[1053,7312,1191],{"class":1096},[1053,7314,6439],{"class":1260},[1053,7316,1168],{"class":1096},[1053,7318,1489],{"class":1481},[1053,7320,7321],{"class":1485},"HTTP_",[1053,7323,1489],{"class":1481},[1053,7325,1181],{"class":1096},[1053,7327,7328,7331,7333,7335,7337,7340,7343,7346,7348,7350,7353,7355,7357,7359,7362,7364,7367,7370],{"class":1055,"line":2560},[1053,7329,7330],{"class":1070},"                header_name ",[1053,7332,1521],{"class":1096},[1053,7334,7031],{"class":1070},[1053,7336,1723],{"class":1096},[1053,7338,7339],{"class":3044},"5",[1053,7341,7342],{"class":1096},":].",[1053,7344,7345],{"class":1260},"replace",[1053,7347,1168],{"class":1096},[1053,7349,1489],{"class":1481},[1053,7351,7352],{"class":1485},"_",[1053,7354,1489],{"class":1481},[1053,7356,1097],{"class":1096},[1053,7358,1482],{"class":1481},[1053,7360,7361],{"class":1485},"-",[1053,7363,1489],{"class":1481},[1053,7365,7366],{"class":1096},").",[1053,7368,7369],{"class":1260},"title",[1053,7371,1333],{"class":1096},[1053,7373,7374,7377,7379,7382,7384,7386],{"class":1055,"line":2570},[1053,7375,7376],{"class":1070},"                headers",[1053,7378,1723],{"class":1096},[1053,7380,7381],{"class":1070},"header_name",[1053,7383,1729],{"class":1096},[1053,7385,1198],{"class":1096},[1053,7387,7107],{"class":1070},[1053,7389,7390],{"class":1055,"line":2587},[1053,7391,1387],{"class":1070},[1053,7393,7394],{"class":1055,"line":2609},[1053,7395,7396],{"class":1059},"        # Add service authentication\n",[1053,7398,7399,7402,7404,7406,7409,7411,7413,7415,7418,7420],{"class":1055,"line":2628},[1053,7400,7401],{"class":1070},"        headers",[1053,7403,1723],{"class":1096},[1053,7405,1489],{"class":1481},[1053,7407,7408],{"class":1485},"X-Service-Token",[1053,7410,1489],{"class":1481},[1053,7412,1729],{"class":1096},[1053,7414,1198],{"class":1096},[1053,7416,7417],{"class":1070}," settings",[1053,7419,1191],{"class":1096},[1053,7421,7422],{"class":6715},"SERVICE_SECRET_TOKEN\n",[1053,7424,7425,7427,7429,7431,7434,7436,7438,7440,7442,7444,7447],{"class":1055,"line":2651},[1053,7426,7401],{"class":1070},[1053,7428,1723],{"class":1096},[1053,7430,1489],{"class":1481},[1053,7432,7433],{"class":1485},"X-Original-Host",[1053,7435,1489],{"class":1481},[1053,7437,1729],{"class":1096},[1053,7439,1198],{"class":1096},[1053,7441,6265],{"class":1070},[1053,7443,1191],{"class":1096},[1053,7445,7446],{"class":1260},"get_host",[1053,7448,1333],{"class":1096},[1053,7450,7451],{"class":1055,"line":2672},[1053,7452,1387],{"class":1070},[1053,7454,7455,7457],{"class":1055,"line":2680},[1053,7456,1393],{"class":1066},[1053,7458,7459],{"class":1070}," headers\n",[1053,7461,7462],{"class":1055,"line":2685},[1053,7463,1121],{"emptyLinePlaceholder":1120},[1053,7465,7466],{"class":1055,"line":2704},[1053,7467,7468],{"class":1059},"# Migration configuration example\n",[1053,7470,7471],{"class":1055,"line":2714},[1053,7472,7473],{"class":1059},"# settings.py\n",[1053,7475,7476,7478,7480],{"class":1055,"line":2741},[1053,7477,6238],{"class":1187},[1053,7479,1198],{"class":1096},[1053,7481,3536],{"class":1096},[1053,7483,7484,7487,7490,7492,7494],{"class":1055,"line":2756},[1053,7485,7486],{"class":1481},"    '",[1053,7488,7489],{"class":1485},"/api/users/",[1053,7491,1489],{"class":1481},[1053,7493,2393],{"class":1096},[1053,7495,3536],{"class":1096},[1053,7497,7498,7501,7503,7505,7507,7509,7512,7514],{"class":1055,"line":2761},[1053,7499,7500],{"class":1481},"        '",[1053,7502,6526],{"class":1485},[1053,7504,1489],{"class":1481},[1053,7506,2393],{"class":1096},[1053,7508,1482],{"class":1481},[1053,7510,7511],{"class":1485},"http://user-service:8000",[1053,7513,1489],{"class":1481},[1053,7515,2402],{"class":1096},[1053,7517,7518,7520,7522,7524,7526,7529],{"class":1055,"line":2768},[1053,7519,7500],{"class":1481},[1053,7521,6500],{"class":1485},[1053,7523,1489],{"class":1481},[1053,7525,2393],{"class":1096},[1053,7527,7528],{"class":3044}," 10",[1053,7530,7531],{"class":1059},"  # Route 10% of traffic\n",[1053,7533,7534],{"class":1055,"line":2787},[1053,7535,7536],{"class":1096},"    },\n",[1053,7538,7539,7541,7544,7546,7548],{"class":1055,"line":2797},[1053,7540,7486],{"class":1481},[1053,7542,7543],{"class":1485},"/api/products/",[1053,7545,1489],{"class":1481},[1053,7547,2393],{"class":1096},[1053,7549,3536],{"class":1096},[1053,7551,7552,7554,7556,7558,7560,7562,7565,7567],{"class":1055,"line":2802},[1053,7553,7500],{"class":1481},[1053,7555,6526],{"class":1485},[1053,7557,1489],{"class":1481},[1053,7559,2393],{"class":1096},[1053,7561,1482],{"class":1481},[1053,7563,7564],{"class":1485},"http://product-service:8000",[1053,7566,1489],{"class":1481},[1053,7568,2402],{"class":1096},[1053,7570,7571,7573,7575,7577,7579,7582],{"class":1055,"line":2823},[1053,7572,7500],{"class":1481},[1053,7574,6500],{"class":1485},[1053,7576,1489],{"class":1481},[1053,7578,2393],{"class":1096},[1053,7580,7581],{"class":3044}," 25",[1053,7583,7584],{"class":1059},"  # Route 25% of traffic\n",[1053,7586,7587],{"class":1055,"line":2863},[1053,7588,7589],{"class":1096},"    }\n",[1053,7591,7592],{"class":1055,"line":2875},[1053,7593,7594],{"class":1096},"}\n",[1035,7596,7598],{"id":7597},"_2-database-decomposition","2. Database Decomposition",[1026,7600,7601],{},"Gradually separate shared databases:",[1043,7603,7605],{"className":1045,"code":7604,"language":1047,"meta":1048,"style":1048},"# database_decomposition.py\nfrom django.db import models, transaction\nfrom django.conf import settings\nimport json\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass DataMigrationManager:\n    \"\"\"Manage data migration between monolith and microservices\"\"\"\n    \n    def __init__(self):\n        self.migration_log = []\n    \n    def migrate_user_data(self, batch_size=1000):\n        \"\"\"Migrate user data to user service\"\"\"\n        from django.contrib.auth.models import User\n        \n        total_users = User.objects.count()\n        migrated = 0\n        \n        logger.info(f\"Starting migration of {total_users} users\")\n        \n        for offset in range(0, total_users, batch_size):\n            users = User.objects.all()[offset:offset + batch_size]\n            \n            for user in users:\n                try:\n                    self._migrate_single_user(user)\n                    migrated += 1\n                except Exception as e:\n                    logger.error(f\"Failed to migrate user {user.id}: {e}\")\n                    self.migration_log.append({\n                        'type': 'error',\n                        'user_id': user.id,\n                        'error': str(e)\n                    })\n            \n            logger.info(f\"Migrated {migrated}/{total_users} users\")\n        \n        return migrated\n    \n    def _migrate_single_user(self, user):\n        \"\"\"Migrate a single user to user service\"\"\"\n        user_data = {\n            'id': user.id,\n            'username': user.username,\n            'email': user.email,\n            'first_name': user.first_name,\n            'last_name': user.last_name,\n            'is_active': user.is_active,\n            'is_staff': user.is_staff,\n            'date_joined': user.date_joined.isoformat(),\n            'last_login': user.last_login.isoformat() if user.last_login else None\n        }\n        \n        # Send to user service\n        response = requests.post(\n            f\"{settings.USER_SERVICE_URL}/api/v1/users/migrate/\",\n            json=user_data,\n            headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n        )\n        \n        if response.status_code != 201:\n            raise Exception(f\"User service returned {response.status_code}\")\n        \n        self.migration_log.append({\n            'type': 'success',\n            'user_id': user.id,\n            'migrated_at': timezone.now().isoformat()\n        })\n\nclass DualWriteManager:\n    \"\"\"Manage dual writes during migration period\"\"\"\n    \n    def __init__(self):\n        self.enabled = getattr(settings, 'DUAL_WRITE_ENABLED', False)\n    \n    def create_user(self, user_data):\n        \"\"\"Create user in both monolith and microservice\"\"\"\n        if not self.enabled:\n            return self._create_in_monolith(user_data)\n        \n        # Create in monolith first\n        user = self._create_in_monolith(user_data)\n        \n        # Async create in microservice\n        from celery import current_app\n        current_app.send_task(\n            'migration.create_user_in_microservice',\n            args=[user.id, user_data]\n        )\n        \n        return user\n    \n    def update_user(self, user_id, user_data):\n        \"\"\"Update user in both systems\"\"\"\n        if not self.enabled:\n            return self._update_in_monolith(user_id, user_data)\n        \n        # Update in monolith first\n        user = self._update_in_monolith(user_id, user_data)\n        \n        # Async update in microservice\n        from celery import current_app\n        current_app.send_task(\n            'migration.update_user_in_microservice',\n            args=[user_id, user_data]\n        )\n        \n        return user\n    \n    def _create_in_monolith(self, user_data):\n        \"\"\"Create user in monolith\"\"\"\n        from django.contrib.auth.models import User\n        return User.objects.create_user(**user_data)\n    \n    def _update_in_monolith(self, user_id, user_data):\n        \"\"\"Update user in monolith\"\"\"\n        from django.contrib.auth.models import User\n        user = User.objects.get(id=user_id)\n        for key, value in user_data.items():\n            setattr(user, key, value)\n        user.save()\n        return user\n\n# Celery tasks for async operations\nfrom celery import shared_task\n\n@shared_task\ndef create_user_in_microservice(user_id, user_data):\n    \"\"\"Create user in microservice asynchronously\"\"\"\n    try:\n        response = requests.post(\n            f\"{settings.USER_SERVICE_URL}/api/v1/users/\",\n            json=user_data,\n            headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n        )\n        \n        if response.status_code == 201:\n            logger.info(f\"User {user_id} created in microservice\")\n        else:\n            logger.error(f\"Failed to create user {user_id} in microservice: {response.status_code}\")\n            \n    except Exception as e:\n        logger.error(f\"Error creating user {user_id} in microservice: {e}\")\n\n@shared_task\ndef update_user_in_microservice(user_id, user_data):\n    \"\"\"Update user in microservice asynchronously\"\"\"\n    try:\n        response = requests.put(\n            f\"{settings.USER_SERVICE_URL}/api/v1/users/{user_id}/\",\n            json=user_data,\n            headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n        )\n        \n        if response.status_code == 200:\n            logger.info(f\"User {user_id} updated in microservice\")\n        else:\n            logger.error(f\"Failed to update user {user_id} in microservice: {response.status_code}\")\n            \n    except Exception as e:\n        logger.error(f\"Error updating user {user_id} in microservice: {e}\")\n",[1050,7606,7607,7612,7632,7646,7653,7659,7663,7681,7685,7694,7703,7707,7719,7732,7736,7759,7768,7794,7798,7820,7829,7833,7861,7865,7892,7928,7932,7946,7953,7968,7977,7991,8030,8044,8062,8082,8101,8105,8109,8143,8147,8154,8158,8175,8184,8193,8211,8230,8249,8268,8287,8306,8325,8350,8385,8389,8393,8398,8413,8436,8448,8473,8478,8482,8500,8528,8532,8546,8565,8583,8609,8614,8618,8627,8636,8640,8652,8685,8689,8707,8716,8730,8747,8751,8756,8775,8779,8784,8796,8808,8819,8839,8843,8847,8854,8858,8880,8889,8903,8924,8928,8933,8955,8959,8964,8974,8984,8995,9009,9013,9017,9023,9027,9044,9053,9075,9099,9103,9124,9133,9155,9181,9202,9222,9234,9240,9244,9249,9260,9264,9272,9290,9299,9306,9320,9341,9351,9373,9377,9381,9397,9423,9430,9468,9472,9485,9518,9522,9528,9545,9554,9560,9574,9604,9614,9636,9640,9644,9661,9686,9692,9729,9733,9745],{"__ignoreMap":1048},[1053,7608,7609],{"class":1055,"line":1056},[1053,7610,7611],{"class":1059},"# database_decomposition.py\n",[1053,7613,7614,7616,7618,7620,7623,7625,7627,7629],{"class":1055,"line":1063},[1053,7615,1085],{"class":1066},[1053,7617,6067],{"class":1070},[1053,7619,1191],{"class":1096},[1053,7621,7622],{"class":1070},"db ",[1053,7624,1067],{"class":1066},[1053,7626,5802],{"class":1070},[1053,7628,1097],{"class":1096},[1053,7630,7631],{"class":1070}," transaction\n",[1053,7633,7634,7636,7638,7640,7642,7644],{"class":1055,"line":1074},[1053,7635,1085],{"class":1066},[1053,7637,6067],{"class":1070},[1053,7639,1191],{"class":1096},[1053,7641,6109],{"class":1070},[1053,7643,1067],{"class":1066},[1053,7645,6114],{"class":1070},[1053,7647,7648,7650],{"class":1055,"line":1082},[1053,7649,1067],{"class":1066},[1053,7651,7652],{"class":1070}," json\n",[1053,7654,7655,7657],{"class":1055,"line":1103},[1053,7656,1067],{"class":1066},[1053,7658,6128],{"class":1070},[1053,7660,7661],{"class":1055,"line":1117},[1053,7662,1121],{"emptyLinePlaceholder":1120},[1053,7664,7665,7667,7669,7671,7673,7675,7677,7679],{"class":1055,"line":1124},[1053,7666,6137],{"class":1070},[1053,7668,1521],{"class":1096},[1053,7670,6142],{"class":1070},[1053,7672,1191],{"class":1096},[1053,7674,6147],{"class":1260},[1053,7676,1168],{"class":1096},[1053,7678,6153],{"class":6152},[1053,7680,1269],{"class":1096},[1053,7682,7683],{"class":1055,"line":1138},[1053,7684,1121],{"emptyLinePlaceholder":1120},[1053,7686,7687,7689,7692],{"class":1055,"line":1152},[1053,7688,1128],{"class":1127},[1053,7690,7691],{"class":1131}," DataMigrationManager",[1053,7693,1135],{"class":1096},[1053,7695,7696,7698,7701],{"class":1055,"line":1158},[1053,7697,1142],{"class":1141},[1053,7699,7700],{"class":1145},"Manage data migration between monolith and microservices",[1053,7702,1149],{"class":1141},[1053,7704,7705],{"class":1055,"line":1184},[1053,7706,1155],{"class":1070},[1053,7708,7709,7711,7713,7715,7717],{"class":1055,"line":1204},[1053,7710,1161],{"class":1127},[1053,7712,1165],{"class":1164},[1053,7714,1168],{"class":1096},[1053,7716,1172],{"class":1171},[1053,7718,1181],{"class":1096},[1053,7720,7721,7723,7725,7728,7730],{"class":1055,"line":1219},[1053,7722,1188],{"class":1187},[1053,7724,1191],{"class":1096},[1053,7726,7727],{"class":1194},"migration_log",[1053,7729,1198],{"class":1096},[1053,7731,1216],{"class":1096},[1053,7733,7734],{"class":1055,"line":1234},[1053,7735,1155],{"class":1070},[1053,7737,7738,7740,7743,7745,7747,7749,7752,7754,7757],{"class":1055,"line":1248},[1053,7739,1161],{"class":1127},[1053,7741,7742],{"class":1302}," migrate_user_data",[1053,7744,1168],{"class":1096},[1053,7746,1172],{"class":1171},[1053,7748,1097],{"class":1096},[1053,7750,7751],{"class":1177}," batch_size",[1053,7753,1521],{"class":1492},[1053,7755,7756],{"class":3044},"1000",[1053,7758,1181],{"class":1096},[1053,7760,7761,7763,7766],{"class":1055,"line":1272},[1053,7762,1315],{"class":1141},[1053,7764,7765],{"class":1145},"Migrate user data to user service",[1053,7767,1149],{"class":1141},[1053,7769,7770,7773,7775,7777,7780,7782,7785,7787,7789,7791],{"class":1055,"line":1292},[1053,7771,7772],{"class":1066},"        from",[1053,7774,6067],{"class":1070},[1053,7776,1191],{"class":1096},[1053,7778,7779],{"class":1070},"contrib",[1053,7781,1191],{"class":1096},[1053,7783,7784],{"class":1070},"auth",[1053,7786,1191],{"class":1096},[1053,7788,5837],{"class":1070},[1053,7790,1067],{"class":1066},[1053,7792,7793],{"class":1070}," User\n",[1053,7795,7796],{"class":1055,"line":1297},[1053,7797,1387],{"class":1070},[1053,7799,7800,7803,7805,7808,7810,7813,7815,7818],{"class":1055,"line":1312},[1053,7801,7802],{"class":1070},"        total_users ",[1053,7804,1521],{"class":1096},[1053,7806,7807],{"class":1070}," User",[1053,7809,1191],{"class":1096},[1053,7811,7812],{"class":1194},"objects",[1053,7814,1191],{"class":1096},[1053,7816,7817],{"class":1260},"count",[1053,7819,1333],{"class":1096},[1053,7821,7822,7825,7827],{"class":1055,"line":1323},[1053,7823,7824],{"class":1070},"        migrated ",[1053,7826,1521],{"class":1096},[1053,7828,4807],{"class":3044},[1053,7830,7831],{"class":1055,"line":1336},[1053,7832,1387],{"class":1070},[1053,7834,7835,7838,7840,7842,7844,7846,7849,7851,7854,7856,7859],{"class":1055,"line":1348},[1053,7836,7837],{"class":1070},"        logger",[1053,7839,1191],{"class":1096},[1053,7841,7121],{"class":1260},[1053,7843,1168],{"class":1096},[1053,7845,3879],{"class":1127},[1053,7847,7848],{"class":1485},"\"Starting migration of ",[1053,7850,3886],{"class":3885},[1053,7852,7853],{"class":1260},"total_users",[1053,7855,3907],{"class":3885},[1053,7857,7858],{"class":1485}," users\"",[1053,7860,1269],{"class":1096},[1053,7862,7863],{"class":1055,"line":1360},[1053,7864,1387],{"class":1070},[1053,7866,7867,7869,7872,7874,7877,7879,7881,7883,7886,7888,7890],{"class":1055,"line":1372},[1053,7868,1438],{"class":1066},[1053,7870,7871],{"class":1070}," offset ",[1053,7873,1454],{"class":1066},[1053,7875,7876],{"class":1164}," range",[1053,7878,1168],{"class":1096},[1053,7880,3383],{"class":3044},[1053,7882,1097],{"class":1096},[1053,7884,7885],{"class":1260}," total_users",[1053,7887,1097],{"class":1096},[1053,7889,7751],{"class":1260},[1053,7891,1181],{"class":1096},[1053,7893,7894,7897,7899,7901,7903,7905,7907,7910,7913,7916,7918,7921,7924,7926],{"class":1055,"line":1384},[1053,7895,7896],{"class":1070},"            users ",[1053,7898,1521],{"class":1096},[1053,7900,7807],{"class":1070},[1053,7902,1191],{"class":1096},[1053,7904,7812],{"class":1194},[1053,7906,1191],{"class":1096},[1053,7908,7909],{"class":1260},"all",[1053,7911,7912],{"class":1096},"()[",[1053,7914,7915],{"class":1070},"offset",[1053,7917,2393],{"class":1096},[1053,7919,7920],{"class":1070},"offset ",[1053,7922,7923],{"class":1492},"+",[1053,7925,7751],{"class":1070},[1053,7927,4973],{"class":1096},[1053,7929,7930],{"class":1055,"line":1390},[1053,7931,2245],{"class":1070},[1053,7933,7934,7936,7939,7941,7944],{"class":1055,"line":1406},[1053,7935,1967],{"class":1066},[1053,7937,7938],{"class":1070}," user ",[1053,7940,1454],{"class":1066},[1053,7942,7943],{"class":1070}," users",[1053,7945,1135],{"class":1096},[1053,7947,7948,7951],{"class":1055,"line":1411},[1053,7949,7950],{"class":1066},"                try",[1053,7952,1135],{"class":1096},[1053,7954,7955,7957,7959,7962,7964,7966],{"class":1055,"line":1425},[1053,7956,1582],{"class":1187},[1053,7958,1191],{"class":1096},[1053,7960,7961],{"class":1260},"_migrate_single_user",[1053,7963,1168],{"class":1096},[1053,7965,5492],{"class":1260},[1053,7967,1269],{"class":1096},[1053,7969,7970,7973,7975],{"class":1055,"line":1435},[1053,7971,7972],{"class":1070},"                    migrated ",[1053,7974,3140],{"class":1096},[1053,7976,3045],{"class":3044},[1053,7978,7979,7982,7985,7987,7989],{"class":1055,"line":1475},[1053,7980,7981],{"class":1066},"                except",[1053,7983,7984],{"class":1265}," Exception",[1053,7986,2171],{"class":1066},[1053,7988,7181],{"class":1070},[1053,7990,1135],{"class":1096},[1053,7992,7993,7996,7998,8000,8002,8004,8007,8009,8011,8013,8015,8017,8020,8022,8024,8026,8028],{"class":1055,"line":1515},[1053,7994,7995],{"class":1070},"                    logger",[1053,7997,1191],{"class":1096},[1053,7999,7192],{"class":1260},[1053,8001,1168],{"class":1096},[1053,8003,3879],{"class":1127},[1053,8005,8006],{"class":1485},"\"Failed to migrate user ",[1053,8008,3886],{"class":3885},[1053,8010,5492],{"class":1260},[1053,8012,1191],{"class":1096},[1053,8014,2667],{"class":1194},[1053,8016,3907],{"class":3885},[1053,8018,8019],{"class":1485},": ",[1053,8021,3886],{"class":3885},[1053,8023,7204],{"class":1260},[1053,8025,3907],{"class":3885},[1053,8027,5467],{"class":1485},[1053,8029,1269],{"class":1096},[1053,8031,8032,8034,8036,8038,8040,8042],{"class":1055,"line":1543},[1053,8033,1582],{"class":1187},[1053,8035,1191],{"class":1096},[1053,8037,7727],{"class":1194},[1053,8039,1191],{"class":1096},[1053,8041,1591],{"class":1260},[1053,8043,2379],{"class":1096},[1053,8045,8046,8048,8050,8052,8054,8056,8058,8060],{"class":1055,"line":1579},[1053,8047,2878],{"class":1481},[1053,8049,2900],{"class":1485},[1053,8051,1489],{"class":1481},[1053,8053,2393],{"class":1096},[1053,8055,1482],{"class":1481},[1053,8057,7192],{"class":1485},[1053,8059,1489],{"class":1481},[1053,8061,2402],{"class":1096},[1053,8063,8064,8066,8069,8071,8073,8076,8078,8080],{"class":1055,"line":1601},[1053,8065,2878],{"class":1481},[1053,8067,8068],{"class":1485},"user_id",[1053,8070,1489],{"class":1481},[1053,8072,2393],{"class":1096},[1053,8074,8075],{"class":1260}," user",[1053,8077,1191],{"class":1096},[1053,8079,2667],{"class":1194},[1053,8081,2402],{"class":1096},[1053,8083,8084,8086,8088,8090,8092,8095,8097,8099],{"class":1055,"line":1606},[1053,8085,2878],{"class":1481},[1053,8087,7192],{"class":1485},[1053,8089,1489],{"class":1481},[1053,8091,2393],{"class":1096},[1053,8093,8094],{"class":1265}," str",[1053,8096,1168],{"class":1096},[1053,8098,7204],{"class":1260},[1053,8100,1269],{"class":1096},[1053,8102,8103],{"class":1055,"line":1620},[1053,8104,2971],{"class":1096},[1053,8106,8107],{"class":1055,"line":1630},[1053,8108,2245],{"class":1070},[1053,8110,8111,8113,8115,8117,8119,8121,8124,8126,8129,8131,8133,8135,8137,8139,8141],{"class":1055,"line":1648},[1053,8112,7116],{"class":1070},[1053,8114,1191],{"class":1096},[1053,8116,7121],{"class":1260},[1053,8118,1168],{"class":1096},[1053,8120,3879],{"class":1127},[1053,8122,8123],{"class":1485},"\"Migrated ",[1053,8125,3886],{"class":3885},[1053,8127,8128],{"class":1260},"migrated",[1053,8130,3907],{"class":3885},[1053,8132,6614],{"class":1485},[1053,8134,3886],{"class":3885},[1053,8136,7853],{"class":1260},[1053,8138,3907],{"class":3885},[1053,8140,7858],{"class":1485},[1053,8142,1269],{"class":1096},[1053,8144,8145],{"class":1055,"line":1690},[1053,8146,1387],{"class":1070},[1053,8148,8149,8151],{"class":1055,"line":1713},[1053,8150,1393],{"class":1066},[1053,8152,8153],{"class":1070}," migrated\n",[1053,8155,8156],{"class":1055,"line":1747},[1053,8157,1155],{"class":1070},[1053,8159,8160,8162,8165,8167,8169,8171,8173],{"class":1055,"line":1752},[1053,8161,1161],{"class":1127},[1053,8163,8164],{"class":1302}," _migrate_single_user",[1053,8166,1168],{"class":1096},[1053,8168,1172],{"class":1171},[1053,8170,1097],{"class":1096},[1053,8172,8075],{"class":1177},[1053,8174,1181],{"class":1096},[1053,8176,8177,8179,8182],{"class":1055,"line":1766},[1053,8178,1315],{"class":1141},[1053,8180,8181],{"class":1145},"Migrate a single user to user service",[1053,8183,1149],{"class":1141},[1053,8185,8186,8189,8191],{"class":1055,"line":1776},[1053,8187,8188],{"class":1070},"        user_data ",[1053,8190,1521],{"class":1096},[1053,8192,3536],{"class":1096},[1053,8194,8195,8197,8199,8201,8203,8205,8207,8209],{"class":1055,"line":1793},[1053,8196,3542],{"class":1481},[1053,8198,2667],{"class":1485},[1053,8200,1489],{"class":1481},[1053,8202,2393],{"class":1096},[1053,8204,8075],{"class":1070},[1053,8206,1191],{"class":1096},[1053,8208,2667],{"class":1194},[1053,8210,2402],{"class":1096},[1053,8212,8213,8215,8218,8220,8222,8224,8226,8228],{"class":1055,"line":1834},[1053,8214,3542],{"class":1481},[1053,8216,8217],{"class":1485},"username",[1053,8219,1489],{"class":1481},[1053,8221,2393],{"class":1096},[1053,8223,8075],{"class":1070},[1053,8225,1191],{"class":1096},[1053,8227,8217],{"class":1194},[1053,8229,2402],{"class":1096},[1053,8231,8232,8234,8237,8239,8241,8243,8245,8247],{"class":1055,"line":1856},[1053,8233,3542],{"class":1481},[1053,8235,8236],{"class":1485},"email",[1053,8238,1489],{"class":1481},[1053,8240,2393],{"class":1096},[1053,8242,8075],{"class":1070},[1053,8244,1191],{"class":1096},[1053,8246,8236],{"class":1194},[1053,8248,2402],{"class":1096},[1053,8250,8251,8253,8256,8258,8260,8262,8264,8266],{"class":1055,"line":1886},[1053,8252,3542],{"class":1481},[1053,8254,8255],{"class":1485},"first_name",[1053,8257,1489],{"class":1481},[1053,8259,2393],{"class":1096},[1053,8261,8075],{"class":1070},[1053,8263,1191],{"class":1096},[1053,8265,8255],{"class":1194},[1053,8267,2402],{"class":1096},[1053,8269,8270,8272,8275,8277,8279,8281,8283,8285],{"class":1055,"line":1891},[1053,8271,3542],{"class":1481},[1053,8273,8274],{"class":1485},"last_name",[1053,8276,1489],{"class":1481},[1053,8278,2393],{"class":1096},[1053,8280,8075],{"class":1070},[1053,8282,1191],{"class":1096},[1053,8284,8274],{"class":1194},[1053,8286,2402],{"class":1096},[1053,8288,8289,8291,8294,8296,8298,8300,8302,8304],{"class":1055,"line":1905},[1053,8290,3542],{"class":1481},[1053,8292,8293],{"class":1485},"is_active",[1053,8295,1489],{"class":1481},[1053,8297,2393],{"class":1096},[1053,8299,8075],{"class":1070},[1053,8301,1191],{"class":1096},[1053,8303,8293],{"class":1194},[1053,8305,2402],{"class":1096},[1053,8307,8308,8310,8313,8315,8317,8319,8321,8323],{"class":1055,"line":1915},[1053,8309,3542],{"class":1481},[1053,8311,8312],{"class":1485},"is_staff",[1053,8314,1489],{"class":1481},[1053,8316,2393],{"class":1096},[1053,8318,8075],{"class":1070},[1053,8320,1191],{"class":1096},[1053,8322,8312],{"class":1194},[1053,8324,2402],{"class":1096},[1053,8326,8327,8329,8332,8334,8336,8338,8340,8342,8344,8347],{"class":1055,"line":1932},[1053,8328,3542],{"class":1481},[1053,8330,8331],{"class":1485},"date_joined",[1053,8333,1489],{"class":1481},[1053,8335,2393],{"class":1096},[1053,8337,8075],{"class":1070},[1053,8339,1191],{"class":1096},[1053,8341,8331],{"class":1194},[1053,8343,1191],{"class":1096},[1053,8345,8346],{"class":1260},"isoformat",[1053,8348,8349],{"class":1096},"(),\n",[1053,8351,8352,8354,8357,8359,8361,8363,8365,8367,8369,8371,8373,8375,8377,8379,8381,8383],{"class":1055,"line":1964},[1053,8353,3542],{"class":1481},[1053,8355,8356],{"class":1485},"last_login",[1053,8358,1489],{"class":1481},[1053,8360,2393],{"class":1096},[1053,8362,8075],{"class":1070},[1053,8364,1191],{"class":1096},[1053,8366,8356],{"class":1194},[1053,8368,1191],{"class":1096},[1053,8370,8346],{"class":1260},[1053,8372,7065],{"class":1096},[1053,8374,2467],{"class":1066},[1053,8376,8075],{"class":1070},[1053,8378,1191],{"class":1096},[1053,8380,8356],{"class":1194},[1053,8382,2932],{"class":1066},[1053,8384,6541],{"class":5768},[1053,8386,8387],{"class":1055,"line":1995},[1053,8388,3818],{"class":1096},[1053,8390,8391],{"class":1055,"line":2011},[1053,8392,1387],{"class":1070},[1053,8394,8395],{"class":1055,"line":2035},[1053,8396,8397],{"class":1059},"        # Send to user service\n",[1053,8399,8400,8403,8405,8407,8409,8411],{"class":1055,"line":2063},[1053,8401,8402],{"class":1070},"        response ",[1053,8404,1521],{"class":1096},[1053,8406,6692],{"class":1070},[1053,8408,1191],{"class":1096},[1053,8410,6761],{"class":1260},[1053,8412,5688],{"class":1096},[1053,8414,8415,8418,8420,8422,8424,8426,8429,8431,8434],{"class":1055,"line":2085},[1053,8416,8417],{"class":1127},"            f",[1053,8419,5467],{"class":1485},[1053,8421,3886],{"class":3885},[1053,8423,6231],{"class":1260},[1053,8425,1191],{"class":1096},[1053,8427,8428],{"class":6715},"USER_SERVICE_URL",[1053,8430,3907],{"class":3885},[1053,8432,8433],{"class":1485},"/api/v1/users/migrate/\"",[1053,8435,2402],{"class":1096},[1053,8437,8438,8441,8443,8446],{"class":1055,"line":2112},[1053,8439,8440],{"class":5736},"            json",[1053,8442,1521],{"class":1096},[1053,8444,8445],{"class":1260},"user_data",[1053,8447,2402],{"class":1096},[1053,8449,8450,8453,8456,8458,8460,8462,8464,8466,8468,8471],{"class":1055,"line":2117},[1053,8451,8452],{"class":5736},"            headers",[1053,8454,8455],{"class":1096},"={",[1053,8457,1489],{"class":1481},[1053,8459,7408],{"class":1485},[1053,8461,1489],{"class":1481},[1053,8463,2393],{"class":1096},[1053,8465,7417],{"class":1260},[1053,8467,1191],{"class":1096},[1053,8469,8470],{"class":6715},"SERVICE_SECRET_TOKEN",[1053,8472,7594],{"class":1096},[1053,8474,8475],{"class":1055,"line":2136},[1053,8476,8477],{"class":1096},"        )\n",[1053,8479,8480],{"class":1055,"line":2146},[1053,8481,1387],{"class":1070},[1053,8483,8484,8486,8488,8490,8492,8495,8498],{"class":1055,"line":2179},[1053,8485,6302],{"class":1066},[1053,8487,7041],{"class":1070},[1053,8489,1191],{"class":1096},[1053,8491,6971],{"class":1194},[1053,8493,8494],{"class":1492}," !=",[1053,8496,8497],{"class":3044}," 201",[1053,8499,1135],{"class":1096},[1053,8501,8502,8505,8507,8509,8511,8514,8516,8518,8520,8522,8524,8526],{"class":1055,"line":2196},[1053,8503,8504],{"class":1066},"            raise",[1053,8506,7984],{"class":1265},[1053,8508,1168],{"class":1096},[1053,8510,3879],{"class":1127},[1053,8512,8513],{"class":1485},"\"User service returned ",[1053,8515,3886],{"class":3885},[1053,8517,6966],{"class":1260},[1053,8519,1191],{"class":1096},[1053,8521,6971],{"class":1194},[1053,8523,3907],{"class":3885},[1053,8525,5467],{"class":1485},[1053,8527,1269],{"class":1096},[1053,8529,8530],{"class":1055,"line":2201},[1053,8531,1387],{"class":1070},[1053,8533,8534,8536,8538,8540,8542,8544],{"class":1055,"line":2209},[1053,8535,1188],{"class":1187},[1053,8537,1191],{"class":1096},[1053,8539,7727],{"class":1194},[1053,8541,1191],{"class":1096},[1053,8543,1591],{"class":1260},[1053,8545,2379],{"class":1096},[1053,8547,8548,8550,8552,8554,8556,8558,8561,8563],{"class":1055,"line":2232},[1053,8549,3542],{"class":1481},[1053,8551,2900],{"class":1485},[1053,8553,1489],{"class":1481},[1053,8555,2393],{"class":1096},[1053,8557,1482],{"class":1481},[1053,8559,8560],{"class":1485},"success",[1053,8562,1489],{"class":1481},[1053,8564,2402],{"class":1096},[1053,8566,8567,8569,8571,8573,8575,8577,8579,8581],{"class":1055,"line":2242},[1053,8568,3542],{"class":1481},[1053,8570,8068],{"class":1485},[1053,8572,1489],{"class":1481},[1053,8574,2393],{"class":1096},[1053,8576,8075],{"class":1260},[1053,8578,1191],{"class":1096},[1053,8580,2667],{"class":1194},[1053,8582,2402],{"class":1096},[1053,8584,8585,8587,8590,8592,8594,8597,8599,8602,8605,8607],{"class":1055,"line":2248},[1053,8586,3542],{"class":1481},[1053,8588,8589],{"class":1485},"migrated_at",[1053,8591,1489],{"class":1481},[1053,8593,2393],{"class":1096},[1053,8595,8596],{"class":1260}," timezone",[1053,8598,1191],{"class":1096},[1053,8600,8601],{"class":1260},"now",[1053,8603,8604],{"class":1096},"().",[1053,8606,8346],{"class":1260},[1053,8608,1333],{"class":1096},[1053,8610,8611],{"class":1055,"line":2271},[1053,8612,8613],{"class":1096},"        })\n",[1053,8615,8616],{"class":1055,"line":2295},[1053,8617,1121],{"emptyLinePlaceholder":1120},[1053,8619,8620,8622,8625],{"class":1055,"line":2301},[1053,8621,1128],{"class":1127},[1053,8623,8624],{"class":1131}," DualWriteManager",[1053,8626,1135],{"class":1096},[1053,8628,8629,8631,8634],{"class":1055,"line":2322},[1053,8630,1142],{"class":1141},[1053,8632,8633],{"class":1145},"Manage dual writes during migration period",[1053,8635,1149],{"class":1141},[1053,8637,8638],{"class":1055,"line":2369},[1053,8639,1155],{"class":1070},[1053,8641,8642,8644,8646,8648,8650],{"class":1055,"line":2382},[1053,8643,1161],{"class":1127},[1053,8645,1165],{"class":1164},[1053,8647,1168],{"class":1096},[1053,8649,1172],{"class":1171},[1053,8651,1181],{"class":1096},[1053,8653,8654,8656,8658,8661,8663,8665,8667,8669,8671,8673,8676,8678,8680,8683],{"class":1055,"line":2405},[1053,8655,1188],{"class":1187},[1053,8657,1191],{"class":1096},[1053,8659,8660],{"class":1194},"enabled",[1053,8662,1198],{"class":1096},[1053,8664,6226],{"class":1164},[1053,8666,1168],{"class":1096},[1053,8668,6231],{"class":1260},[1053,8670,1097],{"class":1096},[1053,8672,1482],{"class":1481},[1053,8674,8675],{"class":1485},"DUAL_WRITE_ENABLED",[1053,8677,1489],{"class":1481},[1053,8679,1097],{"class":1096},[1053,8681,8682],{"class":5768}," False",[1053,8684,1269],{"class":1096},[1053,8686,8687],{"class":1055,"line":2431},[1053,8688,1155],{"class":1070},[1053,8690,8691,8693,8696,8698,8700,8702,8705],{"class":1055,"line":2488},[1053,8692,1161],{"class":1127},[1053,8694,8695],{"class":1302}," create_user",[1053,8697,1168],{"class":1096},[1053,8699,1172],{"class":1171},[1053,8701,1097],{"class":1096},[1053,8703,8704],{"class":1177}," user_data",[1053,8706,1181],{"class":1096},[1053,8708,8709,8711,8714],{"class":1055,"line":2494},[1053,8710,1315],{"class":1141},[1053,8712,8713],{"class":1145},"Create user in both monolith and microservice",[1053,8715,1149],{"class":1141},[1053,8717,8718,8720,8722,8724,8726,8728],{"class":1055,"line":2499},[1053,8719,6302],{"class":1066},[1053,8721,7068],{"class":1492},[1053,8723,1396],{"class":1187},[1053,8725,1191],{"class":1096},[1053,8727,8660],{"class":1194},[1053,8729,1135],{"class":1096},[1053,8731,8732,8734,8736,8738,8741,8743,8745],{"class":1055,"line":2508},[1053,8733,2502],{"class":1066},[1053,8735,1396],{"class":1187},[1053,8737,1191],{"class":1096},[1053,8739,8740],{"class":1260},"_create_in_monolith",[1053,8742,1168],{"class":1096},[1053,8744,8445],{"class":1260},[1053,8746,1269],{"class":1096},[1053,8748,8749],{"class":1055,"line":2519},[1053,8750,1387],{"class":1070},[1053,8752,8753],{"class":1055,"line":2526},[1053,8754,8755],{"class":1059},"        # Create in monolith first\n",[1053,8757,8758,8761,8763,8765,8767,8769,8771,8773],{"class":1055,"line":2531},[1053,8759,8760],{"class":1070},"        user ",[1053,8762,1521],{"class":1096},[1053,8764,1396],{"class":1187},[1053,8766,1191],{"class":1096},[1053,8768,8740],{"class":1260},[1053,8770,1168],{"class":1096},[1053,8772,8445],{"class":1260},[1053,8774,1269],{"class":1096},[1053,8776,8777],{"class":1055,"line":2550},[1053,8778,1387],{"class":1070},[1053,8780,8781],{"class":1055,"line":2560},[1053,8782,8783],{"class":1059},"        # Async create in microservice\n",[1053,8785,8786,8788,8791,8793],{"class":1055,"line":2570},[1053,8787,7772],{"class":1066},[1053,8789,8790],{"class":1070}," celery ",[1053,8792,1067],{"class":1066},[1053,8794,8795],{"class":1070}," current_app\n",[1053,8797,8798,8801,8803,8806],{"class":1055,"line":2587},[1053,8799,8800],{"class":1070},"        current_app",[1053,8802,1191],{"class":1096},[1053,8804,8805],{"class":1260},"send_task",[1053,8807,5688],{"class":1096},[1053,8809,8810,8812,8815,8817],{"class":1055,"line":2609},[1053,8811,3542],{"class":1481},[1053,8813,8814],{"class":1485},"migration.create_user_in_microservice",[1053,8816,1489],{"class":1481},[1053,8818,2402],{"class":1096},[1053,8820,8821,8824,8827,8829,8831,8833,8835,8837],{"class":1055,"line":2628},[1053,8822,8823],{"class":5736},"            args",[1053,8825,8826],{"class":1096},"=[",[1053,8828,5492],{"class":1260},[1053,8830,1191],{"class":1096},[1053,8832,2667],{"class":1194},[1053,8834,1097],{"class":1096},[1053,8836,8704],{"class":1260},[1053,8838,4973],{"class":1096},[1053,8840,8841],{"class":1055,"line":2651},[1053,8842,8477],{"class":1096},[1053,8844,8845],{"class":1055,"line":2672},[1053,8846,1387],{"class":1070},[1053,8848,8849,8851],{"class":1055,"line":2680},[1053,8850,1393],{"class":1066},[1053,8852,8853],{"class":1070}," user\n",[1053,8855,8856],{"class":1055,"line":2685},[1053,8857,1155],{"class":1070},[1053,8859,8860,8862,8865,8867,8869,8871,8874,8876,8878],{"class":1055,"line":2704},[1053,8861,1161],{"class":1127},[1053,8863,8864],{"class":1302}," update_user",[1053,8866,1168],{"class":1096},[1053,8868,1172],{"class":1171},[1053,8870,1097],{"class":1096},[1053,8872,8873],{"class":1177}," user_id",[1053,8875,1097],{"class":1096},[1053,8877,8704],{"class":1177},[1053,8879,1181],{"class":1096},[1053,8881,8882,8884,8887],{"class":1055,"line":2714},[1053,8883,1315],{"class":1141},[1053,8885,8886],{"class":1145},"Update user in both systems",[1053,8888,1149],{"class":1141},[1053,8890,8891,8893,8895,8897,8899,8901],{"class":1055,"line":2741},[1053,8892,6302],{"class":1066},[1053,8894,7068],{"class":1492},[1053,8896,1396],{"class":1187},[1053,8898,1191],{"class":1096},[1053,8900,8660],{"class":1194},[1053,8902,1135],{"class":1096},[1053,8904,8905,8907,8909,8911,8914,8916,8918,8920,8922],{"class":1055,"line":2756},[1053,8906,2502],{"class":1066},[1053,8908,1396],{"class":1187},[1053,8910,1191],{"class":1096},[1053,8912,8913],{"class":1260},"_update_in_monolith",[1053,8915,1168],{"class":1096},[1053,8917,8068],{"class":1260},[1053,8919,1097],{"class":1096},[1053,8921,8704],{"class":1260},[1053,8923,1269],{"class":1096},[1053,8925,8926],{"class":1055,"line":2761},[1053,8927,1387],{"class":1070},[1053,8929,8930],{"class":1055,"line":2768},[1053,8931,8932],{"class":1059},"        # Update in monolith first\n",[1053,8934,8935,8937,8939,8941,8943,8945,8947,8949,8951,8953],{"class":1055,"line":2787},[1053,8936,8760],{"class":1070},[1053,8938,1521],{"class":1096},[1053,8940,1396],{"class":1187},[1053,8942,1191],{"class":1096},[1053,8944,8913],{"class":1260},[1053,8946,1168],{"class":1096},[1053,8948,8068],{"class":1260},[1053,8950,1097],{"class":1096},[1053,8952,8704],{"class":1260},[1053,8954,1269],{"class":1096},[1053,8956,8957],{"class":1055,"line":2797},[1053,8958,1387],{"class":1070},[1053,8960,8961],{"class":1055,"line":2802},[1053,8962,8963],{"class":1059},"        # Async update in microservice\n",[1053,8965,8966,8968,8970,8972],{"class":1055,"line":2823},[1053,8967,7772],{"class":1066},[1053,8969,8790],{"class":1070},[1053,8971,1067],{"class":1066},[1053,8973,8795],{"class":1070},[1053,8975,8976,8978,8980,8982],{"class":1055,"line":2863},[1053,8977,8800],{"class":1070},[1053,8979,1191],{"class":1096},[1053,8981,8805],{"class":1260},[1053,8983,5688],{"class":1096},[1053,8985,8986,8988,8991,8993],{"class":1055,"line":2875},[1053,8987,3542],{"class":1481},[1053,8989,8990],{"class":1485},"migration.update_user_in_microservice",[1053,8992,1489],{"class":1481},[1053,8994,2402],{"class":1096},[1053,8996,8997,8999,9001,9003,9005,9007],{"class":1055,"line":2895},[1053,8998,8823],{"class":5736},[1053,9000,8826],{"class":1096},[1053,9002,8068],{"class":1260},[1053,9004,1097],{"class":1096},[1053,9006,8704],{"class":1260},[1053,9008,4973],{"class":1096},[1053,9010,9011],{"class":1055,"line":2943},[1053,9012,8477],{"class":1096},[1053,9014,9015],{"class":1055,"line":2968},[1053,9016,1387],{"class":1070},[1053,9018,9019,9021],{"class":1055,"line":2974},[1053,9020,1393],{"class":1066},[1053,9022,8853],{"class":1070},[1053,9024,9025],{"class":1055,"line":2979},[1053,9026,1155],{"class":1070},[1053,9028,9029,9031,9034,9036,9038,9040,9042],{"class":1055,"line":2987},[1053,9030,1161],{"class":1127},[1053,9032,9033],{"class":1302}," _create_in_monolith",[1053,9035,1168],{"class":1096},[1053,9037,1172],{"class":1171},[1053,9039,1097],{"class":1096},[1053,9041,8704],{"class":1177},[1053,9043,1181],{"class":1096},[1053,9045,9046,9048,9051],{"class":1055,"line":2996},[1053,9047,1315],{"class":1141},[1053,9049,9050],{"class":1145},"Create user in monolith",[1053,9052,1149],{"class":1141},[1053,9054,9055,9057,9059,9061,9063,9065,9067,9069,9071,9073],{"class":1055,"line":3003},[1053,9056,7772],{"class":1066},[1053,9058,6067],{"class":1070},[1053,9060,1191],{"class":1096},[1053,9062,7779],{"class":1070},[1053,9064,1191],{"class":1096},[1053,9066,7784],{"class":1070},[1053,9068,1191],{"class":1096},[1053,9070,5837],{"class":1070},[1053,9072,1067],{"class":1066},[1053,9074,7793],{"class":1070},[1053,9076,9077,9079,9081,9083,9085,9087,9090,9092,9095,9097],{"class":1055,"line":3008},[1053,9078,1393],{"class":1066},[1053,9080,7807],{"class":1070},[1053,9082,1191],{"class":1096},[1053,9084,7812],{"class":1194},[1053,9086,1191],{"class":1096},[1053,9088,9089],{"class":1260},"create_user",[1053,9091,1168],{"class":1096},[1053,9093,9094],{"class":1492},"**",[1053,9096,8445],{"class":1260},[1053,9098,1269],{"class":1096},[1053,9100,9101],{"class":1055,"line":3026},[1053,9102,1155],{"class":1070},[1053,9104,9105,9107,9110,9112,9114,9116,9118,9120,9122],{"class":1055,"line":3036},[1053,9106,1161],{"class":1127},[1053,9108,9109],{"class":1302}," _update_in_monolith",[1053,9111,1168],{"class":1096},[1053,9113,1172],{"class":1171},[1053,9115,1097],{"class":1096},[1053,9117,8873],{"class":1177},[1053,9119,1097],{"class":1096},[1053,9121,8704],{"class":1177},[1053,9123,1181],{"class":1096},[1053,9125,9126,9128,9131],{"class":1055,"line":3048},[1053,9127,1315],{"class":1141},[1053,9129,9130],{"class":1145},"Update user in monolith",[1053,9132,1149],{"class":1141},[1053,9134,9135,9137,9139,9141,9143,9145,9147,9149,9151,9153],{"class":1055,"line":3070},[1053,9136,7772],{"class":1066},[1053,9138,6067],{"class":1070},[1053,9140,1191],{"class":1096},[1053,9142,7779],{"class":1070},[1053,9144,1191],{"class":1096},[1053,9146,7784],{"class":1070},[1053,9148,1191],{"class":1096},[1053,9150,5837],{"class":1070},[1053,9152,1067],{"class":1066},[1053,9154,7793],{"class":1070},[1053,9156,9157,9159,9161,9163,9165,9167,9169,9171,9173,9175,9177,9179],{"class":1055,"line":3134},[1053,9158,8760],{"class":1070},[1053,9160,1521],{"class":1096},[1053,9162,7807],{"class":1070},[1053,9164,1191],{"class":1096},[1053,9166,7812],{"class":1194},[1053,9168,1191],{"class":1096},[1053,9170,4357],{"class":1260},[1053,9172,1168],{"class":1096},[1053,9174,2667],{"class":5736},[1053,9176,1521],{"class":1096},[1053,9178,8068],{"class":1260},[1053,9180,1269],{"class":1096},[1053,9182,9183,9185,9188,9190,9192,9194,9196,9198,9200],{"class":1055,"line":3145},[1053,9184,1438],{"class":1066},[1053,9186,9187],{"class":1070}," key",[1053,9189,1097],{"class":1096},[1053,9191,7036],{"class":1070},[1053,9193,1454],{"class":1066},[1053,9195,8704],{"class":1070},[1053,9197,1191],{"class":1096},[1053,9199,3746],{"class":1260},[1053,9201,4219],{"class":1096},[1053,9203,9204,9207,9209,9211,9213,9215,9217,9220],{"class":1055,"line":3153},[1053,9205,9206],{"class":1164},"            setattr",[1053,9208,1168],{"class":1096},[1053,9210,5492],{"class":1260},[1053,9212,1097],{"class":1096},[1053,9214,9187],{"class":1260},[1053,9216,1097],{"class":1096},[1053,9218,9219],{"class":1260}," value",[1053,9221,1269],{"class":1096},[1053,9223,9224,9227,9229,9232],{"class":1055,"line":3158},[1053,9225,9226],{"class":1070},"        user",[1053,9228,1191],{"class":1096},[1053,9230,9231],{"class":1260},"save",[1053,9233,1333],{"class":1096},[1053,9235,9236,9238],{"class":1055,"line":3177},[1053,9237,1393],{"class":1066},[1053,9239,8853],{"class":1070},[1053,9241,9242],{"class":1055,"line":3187},[1053,9243,1121],{"emptyLinePlaceholder":1120},[1053,9245,9246],{"class":1055,"line":3200},[1053,9247,9248],{"class":1059},"# Celery tasks for async operations\n",[1053,9250,9251,9253,9255,9257],{"class":1055,"line":3205},[1053,9252,1085],{"class":1066},[1053,9254,8790],{"class":1070},[1053,9256,1067],{"class":1066},[1053,9258,9259],{"class":1070}," shared_task\n",[1053,9261,9262],{"class":1055,"line":3212},[1053,9263,1121],{"emptyLinePlaceholder":1120},[1053,9265,9266,9269],{"class":1055,"line":3240},[1053,9267,9268],{"class":1096},"@",[1053,9270,9271],{"class":1302},"shared_task\n",[1053,9273,9274,9277,9280,9282,9284,9286,9288],{"class":1055,"line":3256},[1053,9275,9276],{"class":1127},"def",[1053,9278,9279],{"class":1302}," create_user_in_microservice",[1053,9281,1168],{"class":1096},[1053,9283,8068],{"class":1177},[1053,9285,1097],{"class":1096},[1053,9287,8704],{"class":1177},[1053,9289,1181],{"class":1096},[1053,9291,9292,9294,9297],{"class":1055,"line":3261},[1053,9293,1142],{"class":1141},[1053,9295,9296],{"class":1145},"Create user in microservice asynchronously",[1053,9298,1149],{"class":1141},[1053,9300,9301,9304],{"class":1055,"line":3280},[1053,9302,9303],{"class":1066},"    try",[1053,9305,1135],{"class":1096},[1053,9307,9308,9310,9312,9314,9316,9318],{"class":1055,"line":3285},[1053,9309,8402],{"class":1070},[1053,9311,1521],{"class":1096},[1053,9313,6692],{"class":1070},[1053,9315,1191],{"class":1096},[1053,9317,6761],{"class":1260},[1053,9319,5688],{"class":1096},[1053,9321,9322,9324,9326,9328,9330,9332,9334,9336,9339],{"class":1055,"line":3306},[1053,9323,8417],{"class":1127},[1053,9325,5467],{"class":1485},[1053,9327,3886],{"class":3885},[1053,9329,6231],{"class":1260},[1053,9331,1191],{"class":1096},[1053,9333,8428],{"class":6715},[1053,9335,3907],{"class":3885},[1053,9337,9338],{"class":1485},"/api/v1/users/\"",[1053,9340,2402],{"class":1096},[1053,9342,9343,9345,9347,9349],{"class":1055,"line":3328},[1053,9344,8440],{"class":5736},[1053,9346,1521],{"class":1096},[1053,9348,8445],{"class":1260},[1053,9350,2402],{"class":1096},[1053,9352,9353,9355,9357,9359,9361,9363,9365,9367,9369,9371],{"class":1055,"line":3347},[1053,9354,8452],{"class":5736},[1053,9356,8455],{"class":1096},[1053,9358,1489],{"class":1481},[1053,9360,7408],{"class":1485},[1053,9362,1489],{"class":1481},[1053,9364,2393],{"class":1096},[1053,9366,7417],{"class":1260},[1053,9368,1191],{"class":1096},[1053,9370,8470],{"class":6715},[1053,9372,7594],{"class":1096},[1053,9374,9375],{"class":1055,"line":3389},[1053,9376,8477],{"class":1096},[1053,9378,9379],{"class":1055,"line":3412},[1053,9380,1387],{"class":1070},[1053,9382,9383,9385,9387,9389,9391,9393,9395],{"class":1055,"line":3426},[1053,9384,6302],{"class":1066},[1053,9386,7041],{"class":1070},[1053,9388,1191],{"class":1096},[1053,9390,6971],{"class":1194},[1053,9392,2357],{"class":1492},[1053,9394,8497],{"class":3044},[1053,9396,1135],{"class":1096},[1053,9398,9399,9401,9403,9405,9407,9409,9412,9414,9416,9418,9421],{"class":1055,"line":3461},[1053,9400,7116],{"class":1070},[1053,9402,1191],{"class":1096},[1053,9404,7121],{"class":1260},[1053,9406,1168],{"class":1096},[1053,9408,3879],{"class":1127},[1053,9410,9411],{"class":1485},"\"User ",[1053,9413,3886],{"class":3885},[1053,9415,8068],{"class":1260},[1053,9417,3907],{"class":3885},[1053,9419,9420],{"class":1485}," created in microservice\"",[1053,9422,1269],{"class":1096},[1053,9424,9425,9428],{"class":1055,"line":3466},[1053,9426,9427],{"class":1066},"        else",[1053,9429,1135],{"class":1096},[1053,9431,9432,9434,9436,9438,9440,9442,9445,9447,9449,9451,9454,9456,9458,9460,9462,9464,9466],{"class":1055,"line":3483},[1053,9433,7116],{"class":1070},[1053,9435,1191],{"class":1096},[1053,9437,7192],{"class":1260},[1053,9439,1168],{"class":1096},[1053,9441,3879],{"class":1127},[1053,9443,9444],{"class":1485},"\"Failed to create user ",[1053,9446,3886],{"class":3885},[1053,9448,8068],{"class":1260},[1053,9450,3907],{"class":3885},[1053,9452,9453],{"class":1485}," in microservice: ",[1053,9455,3886],{"class":3885},[1053,9457,6966],{"class":1260},[1053,9459,1191],{"class":1096},[1053,9461,6971],{"class":1194},[1053,9463,3907],{"class":3885},[1053,9465,5467],{"class":1485},[1053,9467,1269],{"class":1096},[1053,9469,9470],{"class":1055,"line":3489},[1053,9471,2245],{"class":1070},[1053,9473,9474,9477,9479,9481,9483],{"class":1055,"line":3494},[1053,9475,9476],{"class":1066},"    except",[1053,9478,7984],{"class":1265},[1053,9480,2171],{"class":1066},[1053,9482,7181],{"class":1070},[1053,9484,1135],{"class":1096},[1053,9486,9487,9489,9491,9493,9495,9497,9500,9502,9504,9506,9508,9510,9512,9514,9516],{"class":1055,"line":3502},[1053,9488,7837],{"class":1070},[1053,9490,1191],{"class":1096},[1053,9492,7192],{"class":1260},[1053,9494,1168],{"class":1096},[1053,9496,3879],{"class":1127},[1053,9498,9499],{"class":1485},"\"Error creating user ",[1053,9501,3886],{"class":3885},[1053,9503,8068],{"class":1260},[1053,9505,3907],{"class":3885},[1053,9507,9453],{"class":1485},[1053,9509,3886],{"class":3885},[1053,9511,7204],{"class":1260},[1053,9513,3907],{"class":3885},[1053,9515,5467],{"class":1485},[1053,9517,1269],{"class":1096},[1053,9519,9520],{"class":1055,"line":3507},[1053,9521,1121],{"emptyLinePlaceholder":1120},[1053,9523,9524,9526],{"class":1055,"line":3521},[1053,9525,9268],{"class":1096},[1053,9527,9271],{"class":1302},[1053,9529,9530,9532,9535,9537,9539,9541,9543],{"class":1055,"line":3531},[1053,9531,9276],{"class":1127},[1053,9533,9534],{"class":1302}," update_user_in_microservice",[1053,9536,1168],{"class":1096},[1053,9538,8068],{"class":1177},[1053,9540,1097],{"class":1096},[1053,9542,8704],{"class":1177},[1053,9544,1181],{"class":1096},[1053,9546,9547,9549,9552],{"class":1055,"line":3539},[1053,9548,1142],{"class":1141},[1053,9550,9551],{"class":1145},"Update user in microservice asynchronously",[1053,9553,1149],{"class":1141},[1053,9555,9556,9558],{"class":1055,"line":3559},[1053,9557,9303],{"class":1066},[1053,9559,1135],{"class":1096},[1053,9561,9562,9564,9566,9568,9570,9572],{"class":1055,"line":3606},[1053,9563,8402],{"class":1070},[1053,9565,1521],{"class":1096},[1053,9567,6692],{"class":1070},[1053,9569,1191],{"class":1096},[1053,9571,6822],{"class":1260},[1053,9573,5688],{"class":1096},[1053,9575,9576,9578,9580,9582,9584,9586,9588,9590,9593,9595,9597,9599,9602],{"class":1055,"line":3649},[1053,9577,8417],{"class":1127},[1053,9579,5467],{"class":1485},[1053,9581,3886],{"class":3885},[1053,9583,6231],{"class":1260},[1053,9585,1191],{"class":1096},[1053,9587,8428],{"class":6715},[1053,9589,3907],{"class":3885},[1053,9591,9592],{"class":1485},"/api/v1/users/",[1053,9594,3886],{"class":3885},[1053,9596,8068],{"class":1260},[1053,9598,3907],{"class":3885},[1053,9600,9601],{"class":1485},"/\"",[1053,9603,2402],{"class":1096},[1053,9605,9606,9608,9610,9612],{"class":1055,"line":3674},[1053,9607,8440],{"class":5736},[1053,9609,1521],{"class":1096},[1053,9611,8445],{"class":1260},[1053,9613,2402],{"class":1096},[1053,9615,9616,9618,9620,9622,9624,9626,9628,9630,9632,9634],{"class":1055,"line":3688},[1053,9617,8452],{"class":5736},[1053,9619,8455],{"class":1096},[1053,9621,1489],{"class":1481},[1053,9623,7408],{"class":1485},[1053,9625,1489],{"class":1481},[1053,9627,2393],{"class":1096},[1053,9629,7417],{"class":1260},[1053,9631,1191],{"class":1096},[1053,9633,8470],{"class":6715},[1053,9635,7594],{"class":1096},[1053,9637,9638],{"class":1055,"line":3725},[1053,9639,8477],{"class":1096},[1053,9641,9642],{"class":1055,"line":3751},[1053,9643,1387],{"class":1070},[1053,9645,9646,9648,9650,9652,9654,9656,9659],{"class":1055,"line":3757},[1053,9647,6302],{"class":1066},[1053,9649,7041],{"class":1070},[1053,9651,1191],{"class":1096},[1053,9653,6971],{"class":1194},[1053,9655,2357],{"class":1492},[1053,9657,9658],{"class":3044}," 200",[1053,9660,1135],{"class":1096},[1053,9662,9663,9665,9667,9669,9671,9673,9675,9677,9679,9681,9684],{"class":1055,"line":3771},[1053,9664,7116],{"class":1070},[1053,9666,1191],{"class":1096},[1053,9668,7121],{"class":1260},[1053,9670,1168],{"class":1096},[1053,9672,3879],{"class":1127},[1053,9674,9411],{"class":1485},[1053,9676,3886],{"class":3885},[1053,9678,8068],{"class":1260},[1053,9680,3907],{"class":3885},[1053,9682,9683],{"class":1485}," updated in microservice\"",[1053,9685,1269],{"class":1096},[1053,9687,9688,9690],{"class":1055,"line":3809},[1053,9689,9427],{"class":1066},[1053,9691,1135],{"class":1096},[1053,9693,9694,9696,9698,9700,9702,9704,9707,9709,9711,9713,9715,9717,9719,9721,9723,9725,9727],{"class":1055,"line":3815},[1053,9695,7116],{"class":1070},[1053,9697,1191],{"class":1096},[1053,9699,7192],{"class":1260},[1053,9701,1168],{"class":1096},[1053,9703,3879],{"class":1127},[1053,9705,9706],{"class":1485},"\"Failed to update user ",[1053,9708,3886],{"class":3885},[1053,9710,8068],{"class":1260},[1053,9712,3907],{"class":3885},[1053,9714,9453],{"class":1485},[1053,9716,3886],{"class":3885},[1053,9718,6966],{"class":1260},[1053,9720,1191],{"class":1096},[1053,9722,6971],{"class":1194},[1053,9724,3907],{"class":3885},[1053,9726,5467],{"class":1485},[1053,9728,1269],{"class":1096},[1053,9730,9731],{"class":1055,"line":3821},[1053,9732,2245],{"class":1070},[1053,9734,9735,9737,9739,9741,9743],{"class":1055,"line":3826},[1053,9736,9476],{"class":1066},[1053,9738,7984],{"class":1265},[1053,9740,2171],{"class":1066},[1053,9742,7181],{"class":1070},[1053,9744,1135],{"class":1096},[1053,9746,9747,9749,9751,9753,9755,9757,9760,9762,9764,9766,9768,9770,9772,9774,9776],{"class":1055,"line":3832},[1053,9748,7837],{"class":1070},[1053,9750,1191],{"class":1096},[1053,9752,7192],{"class":1260},[1053,9754,1168],{"class":1096},[1053,9756,3879],{"class":1127},[1053,9758,9759],{"class":1485},"\"Error updating user ",[1053,9761,3886],{"class":3885},[1053,9763,8068],{"class":1260},[1053,9765,3907],{"class":3885},[1053,9767,9453],{"class":1485},[1053,9769,3886],{"class":3885},[1053,9771,7204],{"class":1260},[1053,9773,3907],{"class":3885},[1053,9775,5467],{"class":1485},[1053,9777,1269],{"class":1096},[1035,9779,9781],{"id":9780},"_3-event-driven-migration","3. Event-Driven Migration",[1026,9783,9784],{},"Use events to keep systems synchronized:",[1043,9786,9788],{"className":1045,"code":9787,"language":1047,"meta":1048,"style":1048},"# event_driven_migration.py\nimport json\nfrom django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\nfrom django.contrib.auth.models import User\nfrom celery import shared_task\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass EventPublisher:\n    \"\"\"Publish events during migration\"\"\"\n    \n    def __init__(self):\n        self.enabled = getattr(settings, 'EVENT_PUBLISHING_ENABLED', False)\n    \n    def publish_user_event(self, event_type, user_data):\n        \"\"\"Publish user-related events\"\"\"\n        if not self.enabled:\n            return\n        \n        event = {\n            'event_type': event_type,\n            'service': 'monolith',\n            'timestamp': timezone.now().isoformat(),\n            'data': user_data\n        }\n        \n        # Send to message queue\n        publish_event_async.delay('user.events', event)\n    \n    def publish_order_event(self, event_type, order_data):\n        \"\"\"Publish order-related events\"\"\"\n        if not self.enabled:\n            return\n        \n        event = {\n            'event_type': event_type,\n            'service': 'monolith',\n            'timestamp': timezone.now().isoformat(),\n            'data': order_data\n        }\n        \n        publish_event_async.delay('order.events', event)\n\nevent_publisher = EventPublisher()\n\n# Signal handlers for event publishing\n@receiver(post_save, sender=User)\ndef publish_user_saved_event(sender, instance, created, **kwargs):\n    \"\"\"Publish user saved event\"\"\"\n    event_type = 'user.created' if created else 'user.updated'\n    \n    user_data = {\n        'id': instance.id,\n        'username': instance.username,\n        'email': instance.email,\n        'first_name': instance.first_name,\n        'last_name': instance.last_name,\n        'is_active': instance.is_active,\n        'date_joined': instance.date_joined.isoformat(),\n        'last_login': instance.last_login.isoformat() if instance.last_login else None\n    }\n    \n    event_publisher.publish_user_event(event_type, user_data)\n\n@receiver(post_delete, sender=User)\ndef publish_user_deleted_event(sender, instance, **kwargs):\n    \"\"\"Publish user deleted event\"\"\"\n    user_data = {\n        'id': instance.id,\n        'username': instance.username,\n        'email': instance.email\n    }\n    \n    event_publisher.publish_user_event('user.deleted', user_data)\n\n@shared_task\ndef publish_event_async(topic, event_data):\n    \"\"\"Publish event to message queue asynchronously\"\"\"\n    try:\n        import pika\n        \n        connection = pika.BlockingConnection(\n            pika.URLParameters(settings.RABBITMQ_URL)\n        )\n        channel = connection.channel()\n        \n        # Declare exchange\n        channel.exchange_declare(\n            exchange='migration.events',\n            exchange_type='topic',\n            durable=True\n        )\n        \n        # Publish event\n        channel.basic_publish(\n            exchange='migration.events',\n            routing_key=topic,\n            body=json.dumps(event_data),\n            properties=pika.BasicProperties(\n                delivery_mode=2,  # Make message persistent\n                content_type='application/json'\n            )\n        )\n        \n        connection.close()\n        logger.info(f\"Published event to {topic}\")\n        \n    except Exception as e:\n        logger.error(f\"Failed to publish event: {e}\")\n\nclass EventConsumer:\n    \"\"\"Consume events from monolith in microservices\"\"\"\n    \n    def __init__(self, service_name):\n        self.service_name = service_name\n    \n    def start_consuming(self):\n        \"\"\"Start consuming events\"\"\"\n        import pika\n        \n        connection = pika.BlockingConnection(\n            pika.URLParameters(settings.RABBITMQ_URL)\n        )\n        channel = connection.channel()\n        \n        # Declare exchange\n        channel.exchange_declare(\n            exchange='migration.events',\n            exchange_type='topic',\n            durable=True\n        )\n        \n        # Declare queue\n        queue_name = f'{self.service_name}.migration.events'\n        channel.queue_declare(queue=queue_name, durable=True)\n        \n        # Bind queue to exchange\n        if self.service_name == 'user-service':\n            channel.queue_bind(\n                exchange='migration.events',\n                queue=queue_name,\n                routing_key='user.events'\n            )\n        elif self.service_name == 'order-service':\n            channel.queue_bind(\n                exchange='migration.events',\n                queue=queue_name,\n                routing_key='order.events'\n            )\n        \n        # Start consuming\n        channel.basic_qos(prefetch_count=1)\n        channel.basic_consume(\n            queue=queue_name,\n            on_message_callback=self.handle_event,\n            auto_ack=False\n        )\n        \n        logger.info(f\"Started consuming events for {self.service_name}\")\n        channel.start_consuming()\n    \n    def handle_event(self, ch, method, properties, body):\n        \"\"\"Handle incoming event\"\"\"\n        try:\n            event_data = json.loads(body)\n            event_type = event_data['event_type']\n            \n            if event_type.startswith('user.'):\n                self.handle_user_event(event_data)\n            elif event_type.startswith('order.'):\n                self.handle_order_event(event_data)\n            \n            # Acknowledge message\n            ch.basic_ack(delivery_tag=method.delivery_tag)\n            \n        except Exception as e:\n            logger.error(f\"Error handling event: {e}\")\n            # Reject and requeue message\n            ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)\n    \n    def handle_user_event(self, event_data):\n        \"\"\"Handle user-related events\"\"\"\n        event_type = event_data['event_type']\n        user_data = event_data['data']\n        \n        if event_type == 'user.created':\n            self.create_user_from_event(user_data)\n        elif event_type == 'user.updated':\n            self.update_user_from_event(user_data)\n        elif event_type == 'user.deleted':\n            self.delete_user_from_event(user_data)\n    \n    def create_user_from_event(self, user_data):\n        \"\"\"Create user from event data\"\"\"\n        # Implementation depends on microservice\n        logger.info(f\"Creating user from event: {user_data['id']}\")\n    \n    def update_user_from_event(self, user_data):\n        \"\"\"Update user from event data\"\"\"\n        logger.info(f\"Updating user from event: {user_data['id']}\")\n    \n    def delete_user_from_event(self, user_data):\n        \"\"\"Delete user from event data\"\"\"\n        logger.info(f\"Deleting user from event: {user_data['id']}\")\n",[1050,9789,9790,9795,9801,9831,9847,9869,9879,9885,9889,9907,9911,9920,9929,9933,9945,9976,9980,10002,10011,10025,10030,10034,10043,10058,10078,10101,10115,10119,10123,10128,10154,10158,10180,10189,10203,10207,10211,10219,10233,10251,10273,10286,10290,10294,10317,10321,10332,10336,10341,10365,10397,10406,10436,10440,10449,10467,10485,10503,10521,10539,10557,10579,10613,10617,10621,10641,10645,10666,10689,10698,10706,10724,10742,10759,10763,10767,10790,10794,10800,10819,10828,10834,10842,10846,10863,10884,10888,10905,10909,10914,10926,10942,10957,10967,10971,10975,10980,10991,11005,11016,11038,11055,11070,11083,11087,11091,11095,11107,11132,11136,11148,11173,11177,11186,11195,11199,11215,11228,11232,11245,11254,11260,11264,11278,11296,11300,11314,11318,11322,11332,11346,11360,11368,11372,11376,11381,11405,11435,11439,11444,11465,11477,11492,11503,11516,11520,11542,11552,11566,11576,11588,11592,11596,11601,11621,11632,11643,11659,11669,11673,11677,11706,11717,11721,11754,11763,11769,11791,11811,11816,11838,11854,11876,11892,11897,11903,11929,11934,11947,11973,11979,12012,12017,12035,12045,12065,12084,12089,12108,12124,12141,12157,12174,12190,12195,12213,12223,12229,12265,12270,12288,12298,12334,12339,12357,12367],{"__ignoreMap":1048},[1053,9791,9792],{"class":1055,"line":1056},[1053,9793,9794],{"class":1059},"# event_driven_migration.py\n",[1053,9796,9797,9799],{"class":1055,"line":1063},[1053,9798,1067],{"class":1066},[1053,9800,7652],{"class":1070},[1053,9802,9803,9805,9807,9809,9812,9814,9816,9818,9821,9823,9826,9828],{"class":1055,"line":1074},[1053,9804,1085],{"class":1066},[1053,9806,6067],{"class":1070},[1053,9808,1191],{"class":1096},[1053,9810,9811],{"class":1070},"db",[1053,9813,1191],{"class":1096},[1053,9815,1226],{"class":1070},[1053,9817,1191],{"class":1096},[1053,9819,9820],{"class":1070},"signals ",[1053,9822,1067],{"class":1066},[1053,9824,9825],{"class":1070}," post_save",[1053,9827,1097],{"class":1096},[1053,9829,9830],{"class":1070}," post_delete\n",[1053,9832,9833,9835,9837,9839,9842,9844],{"class":1055,"line":1082},[1053,9834,1085],{"class":1066},[1053,9836,6067],{"class":1070},[1053,9838,1191],{"class":1096},[1053,9840,9841],{"class":1070},"dispatch ",[1053,9843,1067],{"class":1066},[1053,9845,9846],{"class":1070}," receiver\n",[1053,9848,9849,9851,9853,9855,9857,9859,9861,9863,9865,9867],{"class":1055,"line":1103},[1053,9850,1085],{"class":1066},[1053,9852,6067],{"class":1070},[1053,9854,1191],{"class":1096},[1053,9856,7779],{"class":1070},[1053,9858,1191],{"class":1096},[1053,9860,7784],{"class":1070},[1053,9862,1191],{"class":1096},[1053,9864,5837],{"class":1070},[1053,9866,1067],{"class":1066},[1053,9868,7793],{"class":1070},[1053,9870,9871,9873,9875,9877],{"class":1055,"line":1117},[1053,9872,1085],{"class":1066},[1053,9874,8790],{"class":1070},[1053,9876,1067],{"class":1066},[1053,9878,9259],{"class":1070},[1053,9880,9881,9883],{"class":1055,"line":1124},[1053,9882,1067],{"class":1066},[1053,9884,6128],{"class":1070},[1053,9886,9887],{"class":1055,"line":1138},[1053,9888,1121],{"emptyLinePlaceholder":1120},[1053,9890,9891,9893,9895,9897,9899,9901,9903,9905],{"class":1055,"line":1152},[1053,9892,6137],{"class":1070},[1053,9894,1521],{"class":1096},[1053,9896,6142],{"class":1070},[1053,9898,1191],{"class":1096},[1053,9900,6147],{"class":1260},[1053,9902,1168],{"class":1096},[1053,9904,6153],{"class":6152},[1053,9906,1269],{"class":1096},[1053,9908,9909],{"class":1055,"line":1158},[1053,9910,1121],{"emptyLinePlaceholder":1120},[1053,9912,9913,9915,9918],{"class":1055,"line":1184},[1053,9914,1128],{"class":1127},[1053,9916,9917],{"class":1131}," EventPublisher",[1053,9919,1135],{"class":1096},[1053,9921,9922,9924,9927],{"class":1055,"line":1204},[1053,9923,1142],{"class":1141},[1053,9925,9926],{"class":1145},"Publish events during migration",[1053,9928,1149],{"class":1141},[1053,9930,9931],{"class":1055,"line":1219},[1053,9932,1155],{"class":1070},[1053,9934,9935,9937,9939,9941,9943],{"class":1055,"line":1234},[1053,9936,1161],{"class":1127},[1053,9938,1165],{"class":1164},[1053,9940,1168],{"class":1096},[1053,9942,1172],{"class":1171},[1053,9944,1181],{"class":1096},[1053,9946,9947,9949,9951,9953,9955,9957,9959,9961,9963,9965,9968,9970,9972,9974],{"class":1055,"line":1248},[1053,9948,1188],{"class":1187},[1053,9950,1191],{"class":1096},[1053,9952,8660],{"class":1194},[1053,9954,1198],{"class":1096},[1053,9956,6226],{"class":1164},[1053,9958,1168],{"class":1096},[1053,9960,6231],{"class":1260},[1053,9962,1097],{"class":1096},[1053,9964,1482],{"class":1481},[1053,9966,9967],{"class":1485},"EVENT_PUBLISHING_ENABLED",[1053,9969,1489],{"class":1481},[1053,9971,1097],{"class":1096},[1053,9973,8682],{"class":5768},[1053,9975,1269],{"class":1096},[1053,9977,9978],{"class":1055,"line":1272},[1053,9979,1155],{"class":1070},[1053,9981,9982,9984,9987,9989,9991,9993,9996,9998,10000],{"class":1055,"line":1292},[1053,9983,1161],{"class":1127},[1053,9985,9986],{"class":1302}," publish_user_event",[1053,9988,1168],{"class":1096},[1053,9990,1172],{"class":1171},[1053,9992,1097],{"class":1096},[1053,9994,9995],{"class":1177}," event_type",[1053,9997,1097],{"class":1096},[1053,9999,8704],{"class":1177},[1053,10001,1181],{"class":1096},[1053,10003,10004,10006,10009],{"class":1055,"line":1297},[1053,10005,1315],{"class":1141},[1053,10007,10008],{"class":1145},"Publish user-related events",[1053,10010,1149],{"class":1141},[1053,10012,10013,10015,10017,10019,10021,10023],{"class":1055,"line":1312},[1053,10014,6302],{"class":1066},[1053,10016,7068],{"class":1492},[1053,10018,1396],{"class":1187},[1053,10020,1191],{"class":1096},[1053,10022,8660],{"class":1194},[1053,10024,1135],{"class":1096},[1053,10026,10027],{"class":1055,"line":1323},[1053,10028,10029],{"class":1066},"            return\n",[1053,10031,10032],{"class":1055,"line":1336},[1053,10033,1387],{"class":1070},[1053,10035,10036,10039,10041],{"class":1055,"line":1348},[1053,10037,10038],{"class":1070},"        event ",[1053,10040,1521],{"class":1096},[1053,10042,3536],{"class":1096},[1053,10044,10045,10047,10050,10052,10054,10056],{"class":1055,"line":1360},[1053,10046,3542],{"class":1481},[1053,10048,10049],{"class":1485},"event_type",[1053,10051,1489],{"class":1481},[1053,10053,2393],{"class":1096},[1053,10055,9995],{"class":1070},[1053,10057,2402],{"class":1096},[1053,10059,10060,10062,10065,10067,10069,10071,10074,10076],{"class":1055,"line":1372},[1053,10061,3542],{"class":1481},[1053,10063,10064],{"class":1485},"service",[1053,10066,1489],{"class":1481},[1053,10068,2393],{"class":1096},[1053,10070,1482],{"class":1481},[1053,10072,10073],{"class":1485},"monolith",[1053,10075,1489],{"class":1481},[1053,10077,2402],{"class":1096},[1053,10079,10080,10082,10085,10087,10089,10091,10093,10095,10097,10099],{"class":1055,"line":1384},[1053,10081,3542],{"class":1481},[1053,10083,10084],{"class":1485},"timestamp",[1053,10086,1489],{"class":1481},[1053,10088,2393],{"class":1096},[1053,10090,8596],{"class":1070},[1053,10092,1191],{"class":1096},[1053,10094,8601],{"class":1260},[1053,10096,8604],{"class":1096},[1053,10098,8346],{"class":1260},[1053,10100,8349],{"class":1096},[1053,10102,10103,10105,10108,10110,10112],{"class":1055,"line":1390},[1053,10104,3542],{"class":1481},[1053,10106,10107],{"class":1485},"data",[1053,10109,1489],{"class":1481},[1053,10111,2393],{"class":1096},[1053,10113,10114],{"class":1070}," user_data\n",[1053,10116,10117],{"class":1055,"line":1406},[1053,10118,3818],{"class":1096},[1053,10120,10121],{"class":1055,"line":1411},[1053,10122,1387],{"class":1070},[1053,10124,10125],{"class":1055,"line":1425},[1053,10126,10127],{"class":1059},"        # Send to message queue\n",[1053,10129,10130,10133,10135,10138,10140,10142,10145,10147,10149,10152],{"class":1055,"line":1435},[1053,10131,10132],{"class":1070},"        publish_event_async",[1053,10134,1191],{"class":1096},[1053,10136,10137],{"class":1260},"delay",[1053,10139,1168],{"class":1096},[1053,10141,1489],{"class":1481},[1053,10143,10144],{"class":1485},"user.events",[1053,10146,1489],{"class":1481},[1053,10148,1097],{"class":1096},[1053,10150,10151],{"class":1260}," event",[1053,10153,1269],{"class":1096},[1053,10155,10156],{"class":1055,"line":1475},[1053,10157,1155],{"class":1070},[1053,10159,10160,10162,10165,10167,10169,10171,10173,10175,10178],{"class":1055,"line":1515},[1053,10161,1161],{"class":1127},[1053,10163,10164],{"class":1302}," publish_order_event",[1053,10166,1168],{"class":1096},[1053,10168,1172],{"class":1171},[1053,10170,1097],{"class":1096},[1053,10172,9995],{"class":1177},[1053,10174,1097],{"class":1096},[1053,10176,10177],{"class":1177}," order_data",[1053,10179,1181],{"class":1096},[1053,10181,10182,10184,10187],{"class":1055,"line":1543},[1053,10183,1315],{"class":1141},[1053,10185,10186],{"class":1145},"Publish order-related events",[1053,10188,1149],{"class":1141},[1053,10190,10191,10193,10195,10197,10199,10201],{"class":1055,"line":1579},[1053,10192,6302],{"class":1066},[1053,10194,7068],{"class":1492},[1053,10196,1396],{"class":1187},[1053,10198,1191],{"class":1096},[1053,10200,8660],{"class":1194},[1053,10202,1135],{"class":1096},[1053,10204,10205],{"class":1055,"line":1601},[1053,10206,10029],{"class":1066},[1053,10208,10209],{"class":1055,"line":1606},[1053,10210,1387],{"class":1070},[1053,10212,10213,10215,10217],{"class":1055,"line":1620},[1053,10214,10038],{"class":1070},[1053,10216,1521],{"class":1096},[1053,10218,3536],{"class":1096},[1053,10220,10221,10223,10225,10227,10229,10231],{"class":1055,"line":1630},[1053,10222,3542],{"class":1481},[1053,10224,10049],{"class":1485},[1053,10226,1489],{"class":1481},[1053,10228,2393],{"class":1096},[1053,10230,9995],{"class":1070},[1053,10232,2402],{"class":1096},[1053,10234,10235,10237,10239,10241,10243,10245,10247,10249],{"class":1055,"line":1648},[1053,10236,3542],{"class":1481},[1053,10238,10064],{"class":1485},[1053,10240,1489],{"class":1481},[1053,10242,2393],{"class":1096},[1053,10244,1482],{"class":1481},[1053,10246,10073],{"class":1485},[1053,10248,1489],{"class":1481},[1053,10250,2402],{"class":1096},[1053,10252,10253,10255,10257,10259,10261,10263,10265,10267,10269,10271],{"class":1055,"line":1690},[1053,10254,3542],{"class":1481},[1053,10256,10084],{"class":1485},[1053,10258,1489],{"class":1481},[1053,10260,2393],{"class":1096},[1053,10262,8596],{"class":1070},[1053,10264,1191],{"class":1096},[1053,10266,8601],{"class":1260},[1053,10268,8604],{"class":1096},[1053,10270,8346],{"class":1260},[1053,10272,8349],{"class":1096},[1053,10274,10275,10277,10279,10281,10283],{"class":1055,"line":1713},[1053,10276,3542],{"class":1481},[1053,10278,10107],{"class":1485},[1053,10280,1489],{"class":1481},[1053,10282,2393],{"class":1096},[1053,10284,10285],{"class":1070}," order_data\n",[1053,10287,10288],{"class":1055,"line":1747},[1053,10289,3818],{"class":1096},[1053,10291,10292],{"class":1055,"line":1752},[1053,10293,1387],{"class":1070},[1053,10295,10296,10298,10300,10302,10304,10306,10309,10311,10313,10315],{"class":1055,"line":1766},[1053,10297,10132],{"class":1070},[1053,10299,1191],{"class":1096},[1053,10301,10137],{"class":1260},[1053,10303,1168],{"class":1096},[1053,10305,1489],{"class":1481},[1053,10307,10308],{"class":1485},"order.events",[1053,10310,1489],{"class":1481},[1053,10312,1097],{"class":1096},[1053,10314,10151],{"class":1260},[1053,10316,1269],{"class":1096},[1053,10318,10319],{"class":1055,"line":1776},[1053,10320,1121],{"emptyLinePlaceholder":1120},[1053,10322,10323,10326,10328,10330],{"class":1055,"line":1793},[1053,10324,10325],{"class":1070},"event_publisher ",[1053,10327,1521],{"class":1096},[1053,10329,9917],{"class":1260},[1053,10331,1333],{"class":1096},[1053,10333,10334],{"class":1055,"line":1834},[1053,10335,1121],{"emptyLinePlaceholder":1120},[1053,10337,10338],{"class":1055,"line":1856},[1053,10339,10340],{"class":1059},"# Signal handlers for event publishing\n",[1053,10342,10343,10345,10348,10350,10353,10355,10358,10360,10363],{"class":1055,"line":1886},[1053,10344,9268],{"class":1096},[1053,10346,10347],{"class":1302},"receiver",[1053,10349,1168],{"class":1096},[1053,10351,10352],{"class":1260},"post_save",[1053,10354,1097],{"class":1096},[1053,10356,10357],{"class":5736}," sender",[1053,10359,1521],{"class":1096},[1053,10361,10362],{"class":1260},"User",[1053,10364,1269],{"class":1096},[1053,10366,10367,10369,10372,10374,10377,10379,10382,10384,10387,10389,10392,10395],{"class":1055,"line":1891},[1053,10368,9276],{"class":1127},[1053,10370,10371],{"class":1302}," publish_user_saved_event",[1053,10373,1168],{"class":1096},[1053,10375,10376],{"class":1177},"sender",[1053,10378,1097],{"class":1096},[1053,10380,10381],{"class":1177}," instance",[1053,10383,1097],{"class":1096},[1053,10385,10386],{"class":1177}," created",[1053,10388,1097],{"class":1096},[1053,10390,10391],{"class":1492}," **",[1053,10393,10394],{"class":1177},"kwargs",[1053,10396,1181],{"class":1096},[1053,10398,10399,10401,10404],{"class":1055,"line":1905},[1053,10400,1142],{"class":1141},[1053,10402,10403],{"class":1145},"Publish user saved event",[1053,10405,1149],{"class":1141},[1053,10407,10408,10411,10413,10415,10418,10420,10422,10425,10428,10430,10433],{"class":1055,"line":1915},[1053,10409,10410],{"class":1070},"    event_type ",[1053,10412,1521],{"class":1096},[1053,10414,1482],{"class":1481},[1053,10416,10417],{"class":1485},"user.created",[1053,10419,1489],{"class":1481},[1053,10421,2467],{"class":1066},[1053,10423,10424],{"class":1070}," created ",[1053,10426,10427],{"class":1066},"else",[1053,10429,1482],{"class":1481},[1053,10431,10432],{"class":1485},"user.updated",[1053,10434,10435],{"class":1481},"'\n",[1053,10437,10438],{"class":1055,"line":1932},[1053,10439,1155],{"class":1070},[1053,10441,10442,10445,10447],{"class":1055,"line":1964},[1053,10443,10444],{"class":1070},"    user_data ",[1053,10446,1521],{"class":1096},[1053,10448,3536],{"class":1096},[1053,10450,10451,10453,10455,10457,10459,10461,10463,10465],{"class":1055,"line":1995},[1053,10452,7500],{"class":1481},[1053,10454,2667],{"class":1485},[1053,10456,1489],{"class":1481},[1053,10458,2393],{"class":1096},[1053,10460,10381],{"class":1070},[1053,10462,1191],{"class":1096},[1053,10464,2667],{"class":1194},[1053,10466,2402],{"class":1096},[1053,10468,10469,10471,10473,10475,10477,10479,10481,10483],{"class":1055,"line":2011},[1053,10470,7500],{"class":1481},[1053,10472,8217],{"class":1485},[1053,10474,1489],{"class":1481},[1053,10476,2393],{"class":1096},[1053,10478,10381],{"class":1070},[1053,10480,1191],{"class":1096},[1053,10482,8217],{"class":1194},[1053,10484,2402],{"class":1096},[1053,10486,10487,10489,10491,10493,10495,10497,10499,10501],{"class":1055,"line":2035},[1053,10488,7500],{"class":1481},[1053,10490,8236],{"class":1485},[1053,10492,1489],{"class":1481},[1053,10494,2393],{"class":1096},[1053,10496,10381],{"class":1070},[1053,10498,1191],{"class":1096},[1053,10500,8236],{"class":1194},[1053,10502,2402],{"class":1096},[1053,10504,10505,10507,10509,10511,10513,10515,10517,10519],{"class":1055,"line":2063},[1053,10506,7500],{"class":1481},[1053,10508,8255],{"class":1485},[1053,10510,1489],{"class":1481},[1053,10512,2393],{"class":1096},[1053,10514,10381],{"class":1070},[1053,10516,1191],{"class":1096},[1053,10518,8255],{"class":1194},[1053,10520,2402],{"class":1096},[1053,10522,10523,10525,10527,10529,10531,10533,10535,10537],{"class":1055,"line":2085},[1053,10524,7500],{"class":1481},[1053,10526,8274],{"class":1485},[1053,10528,1489],{"class":1481},[1053,10530,2393],{"class":1096},[1053,10532,10381],{"class":1070},[1053,10534,1191],{"class":1096},[1053,10536,8274],{"class":1194},[1053,10538,2402],{"class":1096},[1053,10540,10541,10543,10545,10547,10549,10551,10553,10555],{"class":1055,"line":2112},[1053,10542,7500],{"class":1481},[1053,10544,8293],{"class":1485},[1053,10546,1489],{"class":1481},[1053,10548,2393],{"class":1096},[1053,10550,10381],{"class":1070},[1053,10552,1191],{"class":1096},[1053,10554,8293],{"class":1194},[1053,10556,2402],{"class":1096},[1053,10558,10559,10561,10563,10565,10567,10569,10571,10573,10575,10577],{"class":1055,"line":2117},[1053,10560,7500],{"class":1481},[1053,10562,8331],{"class":1485},[1053,10564,1489],{"class":1481},[1053,10566,2393],{"class":1096},[1053,10568,10381],{"class":1070},[1053,10570,1191],{"class":1096},[1053,10572,8331],{"class":1194},[1053,10574,1191],{"class":1096},[1053,10576,8346],{"class":1260},[1053,10578,8349],{"class":1096},[1053,10580,10581,10583,10585,10587,10589,10591,10593,10595,10597,10599,10601,10603,10605,10607,10609,10611],{"class":1055,"line":2136},[1053,10582,7500],{"class":1481},[1053,10584,8356],{"class":1485},[1053,10586,1489],{"class":1481},[1053,10588,2393],{"class":1096},[1053,10590,10381],{"class":1070},[1053,10592,1191],{"class":1096},[1053,10594,8356],{"class":1194},[1053,10596,1191],{"class":1096},[1053,10598,8346],{"class":1260},[1053,10600,7065],{"class":1096},[1053,10602,2467],{"class":1066},[1053,10604,10381],{"class":1070},[1053,10606,1191],{"class":1096},[1053,10608,8356],{"class":1194},[1053,10610,2932],{"class":1066},[1053,10612,6541],{"class":5768},[1053,10614,10615],{"class":1055,"line":2146},[1053,10616,7589],{"class":1096},[1053,10618,10619],{"class":1055,"line":2179},[1053,10620,1155],{"class":1070},[1053,10622,10623,10626,10628,10631,10633,10635,10637,10639],{"class":1055,"line":2196},[1053,10624,10625],{"class":1070},"    event_publisher",[1053,10627,1191],{"class":1096},[1053,10629,10630],{"class":1260},"publish_user_event",[1053,10632,1168],{"class":1096},[1053,10634,10049],{"class":1260},[1053,10636,1097],{"class":1096},[1053,10638,8704],{"class":1260},[1053,10640,1269],{"class":1096},[1053,10642,10643],{"class":1055,"line":2201},[1053,10644,1121],{"emptyLinePlaceholder":1120},[1053,10646,10647,10649,10651,10653,10656,10658,10660,10662,10664],{"class":1055,"line":2209},[1053,10648,9268],{"class":1096},[1053,10650,10347],{"class":1302},[1053,10652,1168],{"class":1096},[1053,10654,10655],{"class":1260},"post_delete",[1053,10657,1097],{"class":1096},[1053,10659,10357],{"class":5736},[1053,10661,1521],{"class":1096},[1053,10663,10362],{"class":1260},[1053,10665,1269],{"class":1096},[1053,10667,10668,10670,10673,10675,10677,10679,10681,10683,10685,10687],{"class":1055,"line":2232},[1053,10669,9276],{"class":1127},[1053,10671,10672],{"class":1302}," publish_user_deleted_event",[1053,10674,1168],{"class":1096},[1053,10676,10376],{"class":1177},[1053,10678,1097],{"class":1096},[1053,10680,10381],{"class":1177},[1053,10682,1097],{"class":1096},[1053,10684,10391],{"class":1492},[1053,10686,10394],{"class":1177},[1053,10688,1181],{"class":1096},[1053,10690,10691,10693,10696],{"class":1055,"line":2242},[1053,10692,1142],{"class":1141},[1053,10694,10695],{"class":1145},"Publish user deleted event",[1053,10697,1149],{"class":1141},[1053,10699,10700,10702,10704],{"class":1055,"line":2248},[1053,10701,10444],{"class":1070},[1053,10703,1521],{"class":1096},[1053,10705,3536],{"class":1096},[1053,10707,10708,10710,10712,10714,10716,10718,10720,10722],{"class":1055,"line":2271},[1053,10709,7500],{"class":1481},[1053,10711,2667],{"class":1485},[1053,10713,1489],{"class":1481},[1053,10715,2393],{"class":1096},[1053,10717,10381],{"class":1070},[1053,10719,1191],{"class":1096},[1053,10721,2667],{"class":1194},[1053,10723,2402],{"class":1096},[1053,10725,10726,10728,10730,10732,10734,10736,10738,10740],{"class":1055,"line":2295},[1053,10727,7500],{"class":1481},[1053,10729,8217],{"class":1485},[1053,10731,1489],{"class":1481},[1053,10733,2393],{"class":1096},[1053,10735,10381],{"class":1070},[1053,10737,1191],{"class":1096},[1053,10739,8217],{"class":1194},[1053,10741,2402],{"class":1096},[1053,10743,10744,10746,10748,10750,10752,10754,10756],{"class":1055,"line":2301},[1053,10745,7500],{"class":1481},[1053,10747,8236],{"class":1485},[1053,10749,1489],{"class":1481},[1053,10751,2393],{"class":1096},[1053,10753,10381],{"class":1070},[1053,10755,1191],{"class":1096},[1053,10757,10758],{"class":1194},"email\n",[1053,10760,10761],{"class":1055,"line":2322},[1053,10762,7589],{"class":1096},[1053,10764,10765],{"class":1055,"line":2369},[1053,10766,1155],{"class":1070},[1053,10768,10769,10771,10773,10775,10777,10779,10782,10784,10786,10788],{"class":1055,"line":2382},[1053,10770,10625],{"class":1070},[1053,10772,1191],{"class":1096},[1053,10774,10630],{"class":1260},[1053,10776,1168],{"class":1096},[1053,10778,1489],{"class":1481},[1053,10780,10781],{"class":1485},"user.deleted",[1053,10783,1489],{"class":1481},[1053,10785,1097],{"class":1096},[1053,10787,8704],{"class":1260},[1053,10789,1269],{"class":1096},[1053,10791,10792],{"class":1055,"line":2405},[1053,10793,1121],{"emptyLinePlaceholder":1120},[1053,10795,10796,10798],{"class":1055,"line":2431},[1053,10797,9268],{"class":1096},[1053,10799,9271],{"class":1302},[1053,10801,10802,10804,10807,10809,10812,10814,10817],{"class":1055,"line":2488},[1053,10803,9276],{"class":1127},[1053,10805,10806],{"class":1302}," publish_event_async",[1053,10808,1168],{"class":1096},[1053,10810,10811],{"class":1177},"topic",[1053,10813,1097],{"class":1096},[1053,10815,10816],{"class":1177}," event_data",[1053,10818,1181],{"class":1096},[1053,10820,10821,10823,10826],{"class":1055,"line":2494},[1053,10822,1142],{"class":1141},[1053,10824,10825],{"class":1145},"Publish event to message queue asynchronously",[1053,10827,1149],{"class":1141},[1053,10829,10830,10832],{"class":1055,"line":2499},[1053,10831,9303],{"class":1066},[1053,10833,1135],{"class":1096},[1053,10835,10836,10839],{"class":1055,"line":2508},[1053,10837,10838],{"class":1066},"        import",[1053,10840,10841],{"class":1070}," pika\n",[1053,10843,10844],{"class":1055,"line":2519},[1053,10845,1387],{"class":1070},[1053,10847,10848,10851,10853,10856,10858,10861],{"class":1055,"line":2526},[1053,10849,10850],{"class":1070},"        connection ",[1053,10852,1521],{"class":1096},[1053,10854,10855],{"class":1070}," pika",[1053,10857,1191],{"class":1096},[1053,10859,10860],{"class":1260},"BlockingConnection",[1053,10862,5688],{"class":1096},[1053,10864,10865,10868,10870,10873,10875,10877,10879,10882],{"class":1055,"line":2531},[1053,10866,10867],{"class":1260},"            pika",[1053,10869,1191],{"class":1096},[1053,10871,10872],{"class":1260},"URLParameters",[1053,10874,1168],{"class":1096},[1053,10876,6231],{"class":1260},[1053,10878,1191],{"class":1096},[1053,10880,10881],{"class":6715},"RABBITMQ_URL",[1053,10883,1269],{"class":1096},[1053,10885,10886],{"class":1055,"line":2550},[1053,10887,8477],{"class":1096},[1053,10889,10890,10893,10895,10898,10900,10903],{"class":1055,"line":2560},[1053,10891,10892],{"class":1070},"        channel ",[1053,10894,1521],{"class":1096},[1053,10896,10897],{"class":1070}," connection",[1053,10899,1191],{"class":1096},[1053,10901,10902],{"class":1260},"channel",[1053,10904,1333],{"class":1096},[1053,10906,10907],{"class":1055,"line":2570},[1053,10908,1387],{"class":1070},[1053,10910,10911],{"class":1055,"line":2587},[1053,10912,10913],{"class":1059},"        # Declare exchange\n",[1053,10915,10916,10919,10921,10924],{"class":1055,"line":2609},[1053,10917,10918],{"class":1070},"        channel",[1053,10920,1191],{"class":1096},[1053,10922,10923],{"class":1260},"exchange_declare",[1053,10925,5688],{"class":1096},[1053,10927,10928,10931,10933,10935,10938,10940],{"class":1055,"line":2628},[1053,10929,10930],{"class":5736},"            exchange",[1053,10932,1521],{"class":1096},[1053,10934,1489],{"class":1481},[1053,10936,10937],{"class":1485},"migration.events",[1053,10939,1489],{"class":1481},[1053,10941,2402],{"class":1096},[1053,10943,10944,10947,10949,10951,10953,10955],{"class":1055,"line":2651},[1053,10945,10946],{"class":5736},"            exchange_type",[1053,10948,1521],{"class":1096},[1053,10950,1489],{"class":1481},[1053,10952,10811],{"class":1485},[1053,10954,1489],{"class":1481},[1053,10956,2402],{"class":1096},[1053,10958,10959,10962,10964],{"class":1055,"line":2672},[1053,10960,10961],{"class":5736},"            durable",[1053,10963,1521],{"class":1096},[1053,10965,10966],{"class":5768},"True\n",[1053,10968,10969],{"class":1055,"line":2680},[1053,10970,8477],{"class":1096},[1053,10972,10973],{"class":1055,"line":2685},[1053,10974,1387],{"class":1070},[1053,10976,10977],{"class":1055,"line":2704},[1053,10978,10979],{"class":1059},"        # Publish event\n",[1053,10981,10982,10984,10986,10989],{"class":1055,"line":2714},[1053,10983,10918],{"class":1070},[1053,10985,1191],{"class":1096},[1053,10987,10988],{"class":1260},"basic_publish",[1053,10990,5688],{"class":1096},[1053,10992,10993,10995,10997,10999,11001,11003],{"class":1055,"line":2741},[1053,10994,10930],{"class":5736},[1053,10996,1521],{"class":1096},[1053,10998,1489],{"class":1481},[1053,11000,10937],{"class":1485},[1053,11002,1489],{"class":1481},[1053,11004,2402],{"class":1096},[1053,11006,11007,11010,11012,11014],{"class":1055,"line":2756},[1053,11008,11009],{"class":5736},"            routing_key",[1053,11011,1521],{"class":1096},[1053,11013,10811],{"class":1260},[1053,11015,2402],{"class":1096},[1053,11017,11018,11021,11023,11026,11028,11031,11033,11036],{"class":1055,"line":2761},[1053,11019,11020],{"class":5736},"            body",[1053,11022,1521],{"class":1096},[1053,11024,11025],{"class":1260},"json",[1053,11027,1191],{"class":1096},[1053,11029,11030],{"class":1260},"dumps",[1053,11032,1168],{"class":1096},[1053,11034,11035],{"class":1260},"event_data",[1053,11037,2428],{"class":1096},[1053,11039,11040,11043,11045,11048,11050,11053],{"class":1055,"line":2768},[1053,11041,11042],{"class":5736},"            properties",[1053,11044,1521],{"class":1096},[1053,11046,11047],{"class":1260},"pika",[1053,11049,1191],{"class":1096},[1053,11051,11052],{"class":1260},"BasicProperties",[1053,11054,5688],{"class":1096},[1053,11056,11057,11060,11062,11065,11067],{"class":1055,"line":2787},[1053,11058,11059],{"class":5736},"                delivery_mode",[1053,11061,1521],{"class":1096},[1053,11063,11064],{"class":3044},"2",[1053,11066,1097],{"class":1096},[1053,11068,11069],{"class":1059},"  # Make message persistent\n",[1053,11071,11072,11074,11076,11078,11081],{"class":1055,"line":2797},[1053,11073,6978],{"class":5736},[1053,11075,1521],{"class":1096},[1053,11077,1489],{"class":1481},[1053,11079,11080],{"class":1485},"application/json",[1053,11082,10435],{"class":1481},[1053,11084,11085],{"class":1055,"line":2802},[1053,11086,7015],{"class":1096},[1053,11088,11089],{"class":1055,"line":2823},[1053,11090,8477],{"class":1096},[1053,11092,11093],{"class":1055,"line":2863},[1053,11094,1387],{"class":1070},[1053,11096,11097,11100,11102,11105],{"class":1055,"line":2875},[1053,11098,11099],{"class":1070},"        connection",[1053,11101,1191],{"class":1096},[1053,11103,11104],{"class":1260},"close",[1053,11106,1333],{"class":1096},[1053,11108,11109,11111,11113,11115,11117,11119,11122,11124,11126,11128,11130],{"class":1055,"line":2895},[1053,11110,7837],{"class":1070},[1053,11112,1191],{"class":1096},[1053,11114,7121],{"class":1260},[1053,11116,1168],{"class":1096},[1053,11118,3879],{"class":1127},[1053,11120,11121],{"class":1485},"\"Published event to ",[1053,11123,3886],{"class":3885},[1053,11125,10811],{"class":1260},[1053,11127,3907],{"class":3885},[1053,11129,5467],{"class":1485},[1053,11131,1269],{"class":1096},[1053,11133,11134],{"class":1055,"line":2943},[1053,11135,1387],{"class":1070},[1053,11137,11138,11140,11142,11144,11146],{"class":1055,"line":2968},[1053,11139,9476],{"class":1066},[1053,11141,7984],{"class":1265},[1053,11143,2171],{"class":1066},[1053,11145,7181],{"class":1070},[1053,11147,1135],{"class":1096},[1053,11149,11150,11152,11154,11156,11158,11160,11163,11165,11167,11169,11171],{"class":1055,"line":2974},[1053,11151,7837],{"class":1070},[1053,11153,1191],{"class":1096},[1053,11155,7192],{"class":1260},[1053,11157,1168],{"class":1096},[1053,11159,3879],{"class":1127},[1053,11161,11162],{"class":1485},"\"Failed to publish event: ",[1053,11164,3886],{"class":3885},[1053,11166,7204],{"class":1260},[1053,11168,3907],{"class":3885},[1053,11170,5467],{"class":1485},[1053,11172,1269],{"class":1096},[1053,11174,11175],{"class":1055,"line":2979},[1053,11176,1121],{"emptyLinePlaceholder":1120},[1053,11178,11179,11181,11184],{"class":1055,"line":2987},[1053,11180,1128],{"class":1127},[1053,11182,11183],{"class":1131}," EventConsumer",[1053,11185,1135],{"class":1096},[1053,11187,11188,11190,11193],{"class":1055,"line":2996},[1053,11189,1142],{"class":1141},[1053,11191,11192],{"class":1145},"Consume events from monolith in microservices",[1053,11194,1149],{"class":1141},[1053,11196,11197],{"class":1055,"line":3003},[1053,11198,1155],{"class":1070},[1053,11200,11201,11203,11205,11207,11209,11211,11213],{"class":1055,"line":3008},[1053,11202,1161],{"class":1127},[1053,11204,1165],{"class":1164},[1053,11206,1168],{"class":1096},[1053,11208,1172],{"class":1171},[1053,11210,1097],{"class":1096},[1053,11212,5604],{"class":1177},[1053,11214,1181],{"class":1096},[1053,11216,11217,11219,11221,11223,11225],{"class":1055,"line":3026},[1053,11218,1188],{"class":1187},[1053,11220,1191],{"class":1096},[1053,11222,5597],{"class":1194},[1053,11224,1198],{"class":1096},[1053,11226,11227],{"class":1070}," service_name\n",[1053,11229,11230],{"class":1055,"line":3036},[1053,11231,1155],{"class":1070},[1053,11233,11234,11236,11239,11241,11243],{"class":1055,"line":3048},[1053,11235,1161],{"class":1127},[1053,11237,11238],{"class":1302}," start_consuming",[1053,11240,1168],{"class":1096},[1053,11242,1172],{"class":1171},[1053,11244,1181],{"class":1096},[1053,11246,11247,11249,11252],{"class":1055,"line":3070},[1053,11248,1315],{"class":1141},[1053,11250,11251],{"class":1145},"Start consuming events",[1053,11253,1149],{"class":1141},[1053,11255,11256,11258],{"class":1055,"line":3134},[1053,11257,10838],{"class":1066},[1053,11259,10841],{"class":1070},[1053,11261,11262],{"class":1055,"line":3145},[1053,11263,1387],{"class":1070},[1053,11265,11266,11268,11270,11272,11274,11276],{"class":1055,"line":3153},[1053,11267,10850],{"class":1070},[1053,11269,1521],{"class":1096},[1053,11271,10855],{"class":1070},[1053,11273,1191],{"class":1096},[1053,11275,10860],{"class":1260},[1053,11277,5688],{"class":1096},[1053,11279,11280,11282,11284,11286,11288,11290,11292,11294],{"class":1055,"line":3158},[1053,11281,10867],{"class":1260},[1053,11283,1191],{"class":1096},[1053,11285,10872],{"class":1260},[1053,11287,1168],{"class":1096},[1053,11289,6231],{"class":1260},[1053,11291,1191],{"class":1096},[1053,11293,10881],{"class":6715},[1053,11295,1269],{"class":1096},[1053,11297,11298],{"class":1055,"line":3177},[1053,11299,8477],{"class":1096},[1053,11301,11302,11304,11306,11308,11310,11312],{"class":1055,"line":3187},[1053,11303,10892],{"class":1070},[1053,11305,1521],{"class":1096},[1053,11307,10897],{"class":1070},[1053,11309,1191],{"class":1096},[1053,11311,10902],{"class":1260},[1053,11313,1333],{"class":1096},[1053,11315,11316],{"class":1055,"line":3200},[1053,11317,1387],{"class":1070},[1053,11319,11320],{"class":1055,"line":3205},[1053,11321,10913],{"class":1059},[1053,11323,11324,11326,11328,11330],{"class":1055,"line":3212},[1053,11325,10918],{"class":1070},[1053,11327,1191],{"class":1096},[1053,11329,10923],{"class":1260},[1053,11331,5688],{"class":1096},[1053,11333,11334,11336,11338,11340,11342,11344],{"class":1055,"line":3240},[1053,11335,10930],{"class":5736},[1053,11337,1521],{"class":1096},[1053,11339,1489],{"class":1481},[1053,11341,10937],{"class":1485},[1053,11343,1489],{"class":1481},[1053,11345,2402],{"class":1096},[1053,11347,11348,11350,11352,11354,11356,11358],{"class":1055,"line":3256},[1053,11349,10946],{"class":5736},[1053,11351,1521],{"class":1096},[1053,11353,1489],{"class":1481},[1053,11355,10811],{"class":1485},[1053,11357,1489],{"class":1481},[1053,11359,2402],{"class":1096},[1053,11361,11362,11364,11366],{"class":1055,"line":3261},[1053,11363,10961],{"class":5736},[1053,11365,1521],{"class":1096},[1053,11367,10966],{"class":5768},[1053,11369,11370],{"class":1055,"line":3280},[1053,11371,8477],{"class":1096},[1053,11373,11374],{"class":1055,"line":3285},[1053,11375,1387],{"class":1070},[1053,11377,11378],{"class":1055,"line":3306},[1053,11379,11380],{"class":1059},"        # Declare queue\n",[1053,11382,11383,11386,11388,11390,11392,11394,11396,11398,11400,11402],{"class":1055,"line":3328},[1053,11384,11385],{"class":1070},"        queue_name ",[1053,11387,1521],{"class":1096},[1053,11389,2174],{"class":1127},[1053,11391,1489],{"class":1485},[1053,11393,3886],{"class":3885},[1053,11395,1172],{"class":1187},[1053,11397,1191],{"class":1096},[1053,11399,5597],{"class":1194},[1053,11401,3907],{"class":3885},[1053,11403,11404],{"class":1485},".migration.events'\n",[1053,11406,11407,11409,11411,11414,11416,11419,11421,11424,11426,11429,11431,11433],{"class":1055,"line":3347},[1053,11408,10918],{"class":1070},[1053,11410,1191],{"class":1096},[1053,11412,11413],{"class":1260},"queue_declare",[1053,11415,1168],{"class":1096},[1053,11417,11418],{"class":5736},"queue",[1053,11420,1521],{"class":1096},[1053,11422,11423],{"class":1260},"queue_name",[1053,11425,1097],{"class":1096},[1053,11427,11428],{"class":5736}," durable",[1053,11430,1521],{"class":1096},[1053,11432,5769],{"class":5768},[1053,11434,1269],{"class":1096},[1053,11436,11437],{"class":1055,"line":3389},[1053,11438,1387],{"class":1070},[1053,11440,11441],{"class":1055,"line":3412},[1053,11442,11443],{"class":1059},"        # Bind queue to exchange\n",[1053,11445,11446,11448,11450,11452,11454,11456,11458,11461,11463],{"class":1055,"line":3426},[1053,11447,6302],{"class":1066},[1053,11449,1396],{"class":1187},[1053,11451,1191],{"class":1096},[1053,11453,5597],{"class":1194},[1053,11455,2357],{"class":1492},[1053,11457,1482],{"class":1481},[1053,11459,11460],{"class":1485},"user-service",[1053,11462,1489],{"class":1481},[1053,11464,1135],{"class":1096},[1053,11466,11467,11470,11472,11475],{"class":1055,"line":3461},[1053,11468,11469],{"class":1070},"            channel",[1053,11471,1191],{"class":1096},[1053,11473,11474],{"class":1260},"queue_bind",[1053,11476,5688],{"class":1096},[1053,11478,11479,11482,11484,11486,11488,11490],{"class":1055,"line":3466},[1053,11480,11481],{"class":5736},"                exchange",[1053,11483,1521],{"class":1096},[1053,11485,1489],{"class":1481},[1053,11487,10937],{"class":1485},[1053,11489,1489],{"class":1481},[1053,11491,2402],{"class":1096},[1053,11493,11494,11497,11499,11501],{"class":1055,"line":3483},[1053,11495,11496],{"class":5736},"                queue",[1053,11498,1521],{"class":1096},[1053,11500,11423],{"class":1260},[1053,11502,2402],{"class":1096},[1053,11504,11505,11508,11510,11512,11514],{"class":1055,"line":3489},[1053,11506,11507],{"class":5736},"                routing_key",[1053,11509,1521],{"class":1096},[1053,11511,1489],{"class":1481},[1053,11513,10144],{"class":1485},[1053,11515,10435],{"class":1481},[1053,11517,11518],{"class":1055,"line":3494},[1053,11519,7015],{"class":1096},[1053,11521,11522,11525,11527,11529,11531,11533,11535,11538,11540],{"class":1055,"line":3502},[1053,11523,11524],{"class":1066},"        elif",[1053,11526,1396],{"class":1187},[1053,11528,1191],{"class":1096},[1053,11530,5597],{"class":1194},[1053,11532,2357],{"class":1492},[1053,11534,1482],{"class":1481},[1053,11536,11537],{"class":1485},"order-service",[1053,11539,1489],{"class":1481},[1053,11541,1135],{"class":1096},[1053,11543,11544,11546,11548,11550],{"class":1055,"line":3507},[1053,11545,11469],{"class":1070},[1053,11547,1191],{"class":1096},[1053,11549,11474],{"class":1260},[1053,11551,5688],{"class":1096},[1053,11553,11554,11556,11558,11560,11562,11564],{"class":1055,"line":3521},[1053,11555,11481],{"class":5736},[1053,11557,1521],{"class":1096},[1053,11559,1489],{"class":1481},[1053,11561,10937],{"class":1485},[1053,11563,1489],{"class":1481},[1053,11565,2402],{"class":1096},[1053,11567,11568,11570,11572,11574],{"class":1055,"line":3531},[1053,11569,11496],{"class":5736},[1053,11571,1521],{"class":1096},[1053,11573,11423],{"class":1260},[1053,11575,2402],{"class":1096},[1053,11577,11578,11580,11582,11584,11586],{"class":1055,"line":3539},[1053,11579,11507],{"class":5736},[1053,11581,1521],{"class":1096},[1053,11583,1489],{"class":1481},[1053,11585,10308],{"class":1485},[1053,11587,10435],{"class":1481},[1053,11589,11590],{"class":1055,"line":3559},[1053,11591,7015],{"class":1096},[1053,11593,11594],{"class":1055,"line":3606},[1053,11595,1387],{"class":1070},[1053,11597,11598],{"class":1055,"line":3649},[1053,11599,11600],{"class":1059},"        # Start consuming\n",[1053,11602,11603,11605,11607,11610,11612,11615,11617,11619],{"class":1055,"line":3674},[1053,11604,10918],{"class":1070},[1053,11606,1191],{"class":1096},[1053,11608,11609],{"class":1260},"basic_qos",[1053,11611,1168],{"class":1096},[1053,11613,11614],{"class":5736},"prefetch_count",[1053,11616,1521],{"class":1096},[1053,11618,6476],{"class":3044},[1053,11620,1269],{"class":1096},[1053,11622,11623,11625,11627,11630],{"class":1055,"line":3688},[1053,11624,10918],{"class":1070},[1053,11626,1191],{"class":1096},[1053,11628,11629],{"class":1260},"basic_consume",[1053,11631,5688],{"class":1096},[1053,11633,11634,11637,11639,11641],{"class":1055,"line":3725},[1053,11635,11636],{"class":5736},"            queue",[1053,11638,1521],{"class":1096},[1053,11640,11423],{"class":1260},[1053,11642,2402],{"class":1096},[1053,11644,11645,11648,11650,11652,11654,11657],{"class":1055,"line":3751},[1053,11646,11647],{"class":5736},"            on_message_callback",[1053,11649,1521],{"class":1096},[1053,11651,1172],{"class":1187},[1053,11653,1191],{"class":1096},[1053,11655,11656],{"class":1194},"handle_event",[1053,11658,2402],{"class":1096},[1053,11660,11661,11664,11666],{"class":1055,"line":3757},[1053,11662,11663],{"class":5736},"            auto_ack",[1053,11665,1521],{"class":1096},[1053,11667,11668],{"class":5768},"False\n",[1053,11670,11671],{"class":1055,"line":3771},[1053,11672,8477],{"class":1096},[1053,11674,11675],{"class":1055,"line":3809},[1053,11676,1387],{"class":1070},[1053,11678,11679,11681,11683,11685,11687,11689,11692,11694,11696,11698,11700,11702,11704],{"class":1055,"line":3815},[1053,11680,7837],{"class":1070},[1053,11682,1191],{"class":1096},[1053,11684,7121],{"class":1260},[1053,11686,1168],{"class":1096},[1053,11688,3879],{"class":1127},[1053,11690,11691],{"class":1485},"\"Started consuming events for ",[1053,11693,3886],{"class":3885},[1053,11695,1172],{"class":1187},[1053,11697,1191],{"class":1096},[1053,11699,5597],{"class":1194},[1053,11701,3907],{"class":3885},[1053,11703,5467],{"class":1485},[1053,11705,1269],{"class":1096},[1053,11707,11708,11710,11712,11715],{"class":1055,"line":3821},[1053,11709,10918],{"class":1070},[1053,11711,1191],{"class":1096},[1053,11713,11714],{"class":1260},"start_consuming",[1053,11716,1333],{"class":1096},[1053,11718,11719],{"class":1055,"line":3826},[1053,11720,1155],{"class":1070},[1053,11722,11723,11725,11728,11730,11732,11734,11737,11739,11742,11744,11747,11749,11752],{"class":1055,"line":3832},[1053,11724,1161],{"class":1127},[1053,11726,11727],{"class":1302}," handle_event",[1053,11729,1168],{"class":1096},[1053,11731,1172],{"class":1171},[1053,11733,1097],{"class":1096},[1053,11735,11736],{"class":1177}," ch",[1053,11738,1097],{"class":1096},[1053,11740,11741],{"class":1177}," method",[1053,11743,1097],{"class":1096},[1053,11745,11746],{"class":1177}," properties",[1053,11748,1097],{"class":1096},[1053,11750,11751],{"class":1177}," body",[1053,11753,1181],{"class":1096},[1053,11755,11756,11758,11761],{"class":1055,"line":3853},[1053,11757,1315],{"class":1141},[1053,11759,11760],{"class":1145},"Handle incoming event",[1053,11762,1149],{"class":1141},[1053,11764,11765,11767],{"class":1055,"line":3871},[1053,11766,2204],{"class":1066},[1053,11768,1135],{"class":1096},[1053,11770,11772,11775,11777,11780,11782,11785,11787,11789],{"class":1055,"line":11771},167,[1053,11773,11774],{"class":1070},"            event_data ",[1053,11776,1521],{"class":1096},[1053,11778,11779],{"class":1070}," json",[1053,11781,1191],{"class":1096},[1053,11783,11784],{"class":1260},"loads",[1053,11786,1168],{"class":1096},[1053,11788,2464],{"class":1260},[1053,11790,1269],{"class":1096},[1053,11792,11794,11797,11799,11801,11803,11805,11807,11809],{"class":1055,"line":11793},168,[1053,11795,11796],{"class":1070},"            event_type ",[1053,11798,1521],{"class":1096},[1053,11800,10816],{"class":1070},[1053,11802,1723],{"class":1096},[1053,11804,1489],{"class":1481},[1053,11806,10049],{"class":1485},[1053,11808,1489],{"class":1481},[1053,11810,4973],{"class":1096},[1053,11812,11814],{"class":1055,"line":11813},169,[1053,11815,2245],{"class":1070},[1053,11817,11819,11821,11823,11825,11827,11829,11831,11834,11836],{"class":1055,"line":11818},170,[1053,11820,1478],{"class":1066},[1053,11822,9995],{"class":1070},[1053,11824,1191],{"class":1096},[1053,11826,6439],{"class":1260},[1053,11828,1168],{"class":1096},[1053,11830,1489],{"class":1481},[1053,11832,11833],{"class":1485},"user.",[1053,11835,1489],{"class":1481},[1053,11837,1181],{"class":1096},[1053,11839,11841,11843,11845,11848,11850,11852],{"class":1055,"line":11840},171,[1053,11842,1716],{"class":1187},[1053,11844,1191],{"class":1096},[1053,11846,11847],{"class":1260},"handle_user_event",[1053,11849,1168],{"class":1096},[1053,11851,11035],{"class":1260},[1053,11853,1269],{"class":1096},[1053,11855,11857,11859,11861,11863,11865,11867,11869,11872,11874],{"class":1055,"line":11856},172,[1053,11858,5487],{"class":1066},[1053,11860,9995],{"class":1070},[1053,11862,1191],{"class":1096},[1053,11864,6439],{"class":1260},[1053,11866,1168],{"class":1096},[1053,11868,1489],{"class":1481},[1053,11870,11871],{"class":1485},"order.",[1053,11873,1489],{"class":1481},[1053,11875,1181],{"class":1096},[1053,11877,11879,11881,11883,11886,11888,11890],{"class":1055,"line":11878},173,[1053,11880,1716],{"class":1187},[1053,11882,1191],{"class":1096},[1053,11884,11885],{"class":1260},"handle_order_event",[1053,11887,1168],{"class":1096},[1053,11889,11035],{"class":1260},[1053,11891,1269],{"class":1096},[1053,11893,11895],{"class":1055,"line":11894},174,[1053,11896,2245],{"class":1070},[1053,11898,11900],{"class":1055,"line":11899},175,[1053,11901,11902],{"class":1059},"            # Acknowledge message\n",[1053,11904,11906,11909,11911,11914,11916,11919,11921,11923,11925,11927],{"class":1055,"line":11905},176,[1053,11907,11908],{"class":1070},"            ch",[1053,11910,1191],{"class":1096},[1053,11912,11913],{"class":1260},"basic_ack",[1053,11915,1168],{"class":1096},[1053,11917,11918],{"class":5736},"delivery_tag",[1053,11920,1521],{"class":1096},[1053,11922,6671],{"class":1260},[1053,11924,1191],{"class":1096},[1053,11926,11918],{"class":1194},[1053,11928,1269],{"class":1096},[1053,11930,11932],{"class":1055,"line":11931},177,[1053,11933,2245],{"class":1070},[1053,11935,11937,11939,11941,11943,11945],{"class":1055,"line":11936},178,[1053,11938,2511],{"class":1066},[1053,11940,7984],{"class":1265},[1053,11942,2171],{"class":1066},[1053,11944,7181],{"class":1070},[1053,11946,1135],{"class":1096},[1053,11948,11950,11952,11954,11956,11958,11960,11963,11965,11967,11969,11971],{"class":1055,"line":11949},179,[1053,11951,7116],{"class":1070},[1053,11953,1191],{"class":1096},[1053,11955,7192],{"class":1260},[1053,11957,1168],{"class":1096},[1053,11959,3879],{"class":1127},[1053,11961,11962],{"class":1485},"\"Error handling event: ",[1053,11964,3886],{"class":3885},[1053,11966,7204],{"class":1260},[1053,11968,3907],{"class":3885},[1053,11970,5467],{"class":1485},[1053,11972,1269],{"class":1096},[1053,11974,11976],{"class":1055,"line":11975},180,[1053,11977,11978],{"class":1059},"            # Reject and requeue message\n",[1053,11980,11982,11984,11986,11989,11991,11993,11995,11997,11999,12001,12003,12006,12008,12010],{"class":1055,"line":11981},181,[1053,11983,11908],{"class":1070},[1053,11985,1191],{"class":1096},[1053,11987,11988],{"class":1260},"basic_nack",[1053,11990,1168],{"class":1096},[1053,11992,11918],{"class":5736},[1053,11994,1521],{"class":1096},[1053,11996,6671],{"class":1260},[1053,11998,1191],{"class":1096},[1053,12000,11918],{"class":1194},[1053,12002,1097],{"class":1096},[1053,12004,12005],{"class":5736}," requeue",[1053,12007,1521],{"class":1096},[1053,12009,5769],{"class":5768},[1053,12011,1269],{"class":1096},[1053,12013,12015],{"class":1055,"line":12014},182,[1053,12016,1155],{"class":1070},[1053,12018,12020,12022,12025,12027,12029,12031,12033],{"class":1055,"line":12019},183,[1053,12021,1161],{"class":1127},[1053,12023,12024],{"class":1302}," handle_user_event",[1053,12026,1168],{"class":1096},[1053,12028,1172],{"class":1171},[1053,12030,1097],{"class":1096},[1053,12032,10816],{"class":1177},[1053,12034,1181],{"class":1096},[1053,12036,12038,12040,12043],{"class":1055,"line":12037},184,[1053,12039,1315],{"class":1141},[1053,12041,12042],{"class":1145},"Handle user-related events",[1053,12044,1149],{"class":1141},[1053,12046,12048,12051,12053,12055,12057,12059,12061,12063],{"class":1055,"line":12047},185,[1053,12049,12050],{"class":1070},"        event_type ",[1053,12052,1521],{"class":1096},[1053,12054,10816],{"class":1070},[1053,12056,1723],{"class":1096},[1053,12058,1489],{"class":1481},[1053,12060,10049],{"class":1485},[1053,12062,1489],{"class":1481},[1053,12064,4973],{"class":1096},[1053,12066,12068,12070,12072,12074,12076,12078,12080,12082],{"class":1055,"line":12067},186,[1053,12069,8188],{"class":1070},[1053,12071,1521],{"class":1096},[1053,12073,10816],{"class":1070},[1053,12075,1723],{"class":1096},[1053,12077,1489],{"class":1481},[1053,12079,10107],{"class":1485},[1053,12081,1489],{"class":1481},[1053,12083,4973],{"class":1096},[1053,12085,12087],{"class":1055,"line":12086},187,[1053,12088,1387],{"class":1070},[1053,12090,12092,12094,12097,12100,12102,12104,12106],{"class":1055,"line":12091},188,[1053,12093,6302],{"class":1066},[1053,12095,12096],{"class":1070}," event_type ",[1053,12098,12099],{"class":1492},"==",[1053,12101,1482],{"class":1481},[1053,12103,10417],{"class":1485},[1053,12105,1489],{"class":1481},[1053,12107,1135],{"class":1096},[1053,12109,12111,12113,12115,12118,12120,12122],{"class":1055,"line":12110},189,[1053,12112,4417],{"class":1187},[1053,12114,1191],{"class":1096},[1053,12116,12117],{"class":1260},"create_user_from_event",[1053,12119,1168],{"class":1096},[1053,12121,8445],{"class":1260},[1053,12123,1269],{"class":1096},[1053,12125,12127,12129,12131,12133,12135,12137,12139],{"class":1055,"line":12126},190,[1053,12128,11524],{"class":1066},[1053,12130,12096],{"class":1070},[1053,12132,12099],{"class":1492},[1053,12134,1482],{"class":1481},[1053,12136,10432],{"class":1485},[1053,12138,1489],{"class":1481},[1053,12140,1135],{"class":1096},[1053,12142,12144,12146,12148,12151,12153,12155],{"class":1055,"line":12143},191,[1053,12145,4417],{"class":1187},[1053,12147,1191],{"class":1096},[1053,12149,12150],{"class":1260},"update_user_from_event",[1053,12152,1168],{"class":1096},[1053,12154,8445],{"class":1260},[1053,12156,1269],{"class":1096},[1053,12158,12160,12162,12164,12166,12168,12170,12172],{"class":1055,"line":12159},192,[1053,12161,11524],{"class":1066},[1053,12163,12096],{"class":1070},[1053,12165,12099],{"class":1492},[1053,12167,1482],{"class":1481},[1053,12169,10781],{"class":1485},[1053,12171,1489],{"class":1481},[1053,12173,1135],{"class":1096},[1053,12175,12177,12179,12181,12184,12186,12188],{"class":1055,"line":12176},193,[1053,12178,4417],{"class":1187},[1053,12180,1191],{"class":1096},[1053,12182,12183],{"class":1260},"delete_user_from_event",[1053,12185,1168],{"class":1096},[1053,12187,8445],{"class":1260},[1053,12189,1269],{"class":1096},[1053,12191,12193],{"class":1055,"line":12192},194,[1053,12194,1155],{"class":1070},[1053,12196,12198,12200,12203,12205,12207,12209,12211],{"class":1055,"line":12197},195,[1053,12199,1161],{"class":1127},[1053,12201,12202],{"class":1302}," create_user_from_event",[1053,12204,1168],{"class":1096},[1053,12206,1172],{"class":1171},[1053,12208,1097],{"class":1096},[1053,12210,8704],{"class":1177},[1053,12212,1181],{"class":1096},[1053,12214,12216,12218,12221],{"class":1055,"line":12215},196,[1053,12217,1315],{"class":1141},[1053,12219,12220],{"class":1145},"Create user from event data",[1053,12222,1149],{"class":1141},[1053,12224,12226],{"class":1055,"line":12225},197,[1053,12227,12228],{"class":1059},"        # Implementation depends on microservice\n",[1053,12230,12232,12234,12236,12238,12240,12242,12245,12247,12249,12251,12253,12255,12257,12259,12261,12263],{"class":1055,"line":12231},198,[1053,12233,7837],{"class":1070},[1053,12235,1191],{"class":1096},[1053,12237,7121],{"class":1260},[1053,12239,1168],{"class":1096},[1053,12241,3879],{"class":1127},[1053,12243,12244],{"class":1485},"\"Creating user from event: ",[1053,12246,3886],{"class":3885},[1053,12248,8445],{"class":1260},[1053,12250,1723],{"class":1096},[1053,12252,1489],{"class":1481},[1053,12254,2667],{"class":1485},[1053,12256,1489],{"class":1481},[1053,12258,1729],{"class":1096},[1053,12260,3907],{"class":3885},[1053,12262,5467],{"class":1485},[1053,12264,1269],{"class":1096},[1053,12266,12268],{"class":1055,"line":12267},199,[1053,12269,1155],{"class":1070},[1053,12271,12273,12275,12278,12280,12282,12284,12286],{"class":1055,"line":12272},200,[1053,12274,1161],{"class":1127},[1053,12276,12277],{"class":1302}," update_user_from_event",[1053,12279,1168],{"class":1096},[1053,12281,1172],{"class":1171},[1053,12283,1097],{"class":1096},[1053,12285,8704],{"class":1177},[1053,12287,1181],{"class":1096},[1053,12289,12291,12293,12296],{"class":1055,"line":12290},201,[1053,12292,1315],{"class":1141},[1053,12294,12295],{"class":1145},"Update user from event data",[1053,12297,1149],{"class":1141},[1053,12299,12301,12303,12305,12307,12309,12311,12314,12316,12318,12320,12322,12324,12326,12328,12330,12332],{"class":1055,"line":12300},202,[1053,12302,7837],{"class":1070},[1053,12304,1191],{"class":1096},[1053,12306,7121],{"class":1260},[1053,12308,1168],{"class":1096},[1053,12310,3879],{"class":1127},[1053,12312,12313],{"class":1485},"\"Updating user from event: ",[1053,12315,3886],{"class":3885},[1053,12317,8445],{"class":1260},[1053,12319,1723],{"class":1096},[1053,12321,1489],{"class":1481},[1053,12323,2667],{"class":1485},[1053,12325,1489],{"class":1481},[1053,12327,1729],{"class":1096},[1053,12329,3907],{"class":3885},[1053,12331,5467],{"class":1485},[1053,12333,1269],{"class":1096},[1053,12335,12337],{"class":1055,"line":12336},203,[1053,12338,1155],{"class":1070},[1053,12340,12342,12344,12347,12349,12351,12353,12355],{"class":1055,"line":12341},204,[1053,12343,1161],{"class":1127},[1053,12345,12346],{"class":1302}," delete_user_from_event",[1053,12348,1168],{"class":1096},[1053,12350,1172],{"class":1171},[1053,12352,1097],{"class":1096},[1053,12354,8704],{"class":1177},[1053,12356,1181],{"class":1096},[1053,12358,12360,12362,12365],{"class":1055,"line":12359},205,[1053,12361,1315],{"class":1141},[1053,12363,12364],{"class":1145},"Delete user from event data",[1053,12366,1149],{"class":1141},[1053,12368,12370,12372,12374,12376,12378,12380,12383,12385,12387,12389,12391,12393,12395,12397,12399,12401],{"class":1055,"line":12369},206,[1053,12371,7837],{"class":1070},[1053,12373,1191],{"class":1096},[1053,12375,7121],{"class":1260},[1053,12377,1168],{"class":1096},[1053,12379,3879],{"class":1127},[1053,12381,12382],{"class":1485},"\"Deleting user from event: ",[1053,12384,3886],{"class":3885},[1053,12386,8445],{"class":1260},[1053,12388,1723],{"class":1096},[1053,12390,1489],{"class":1481},[1053,12392,2667],{"class":1485},[1053,12394,1489],{"class":1481},[1053,12396,1729],{"class":1096},[1053,12398,3907],{"class":3885},[1053,12400,5467],{"class":1485},[1053,12402,1269],{"class":1096},[1030,12404,12406],{"id":12405},"data-consistency-strategies","Data Consistency Strategies",[1035,12408,12410],{"id":12409},"_1-saga-pattern-implementation","1. Saga Pattern Implementation",[1043,12412,12414],{"className":1045,"code":12413,"language":1047,"meta":1048,"style":1048},"# saga_pattern.py\nfrom enum import Enum\nfrom django.db import models, transaction\nimport json\nimport uuid\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass SagaStatus(models.TextChoices):\n    PENDING = 'pending', 'Pending'\n    COMPLETED = 'completed', 'Completed'\n    FAILED = 'failed', 'Failed'\n    COMPENSATING = 'compensating', 'Compensating'\n\nclass SagaStepStatus(models.TextChoices):\n    PENDING = 'pending', 'Pending'\n    COMPLETED = 'completed', 'Completed'\n    FAILED = 'failed', 'Failed'\n    COMPENSATED = 'compensated', 'Compensated'\n\nclass Saga(models.Model):\n    \"\"\"Saga orchestration model\"\"\"\n    \n    id = models.UUIDField(primary_key=True, default=uuid.uuid4)\n    saga_type = models.CharField(max_length=100)\n    status = models.CharField(max_length=20, choices=SagaStatus.choices, default=SagaStatus.PENDING)\n    data = models.JSONField(default=dict)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n    \n    class Meta:\n        db_table = 'sagas'\n\nclass SagaStep(models.Model):\n    \"\"\"Individual saga step\"\"\"\n    \n    id = models.UUIDField(primary_key=True, default=uuid.uuid4)\n    saga = models.ForeignKey(Saga, on_delete=models.CASCADE, related_name='steps')\n    step_name = models.CharField(max_length=100)\n    step_order = models.IntegerField()\n    status = models.CharField(max_length=20, choices=SagaStepStatus.choices, default=SagaStepStatus.PENDING)\n    service_name = models.CharField(max_length=100)\n    action_data = models.JSONField(default=dict)\n    compensation_data = models.JSONField(default=dict)\n    result_data = models.JSONField(default=dict)\n    error_message = models.TextField(blank=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n    \n    class Meta:\n        db_table = 'saga_steps'\n        ordering = ['step_order']\n\nclass SagaOrchestrator:\n    \"\"\"Orchestrate saga execution\"\"\"\n    \n    def __init__(self):\n        self.step_handlers = {\n            'create_user': self.handle_create_user,\n            'create_profile': self.handle_create_profile,\n            'send_welcome_email': self.handle_send_welcome_email,\n            'create_order': self.handle_create_order,\n            'reserve_inventory': self.handle_reserve_inventory,\n            'process_payment': self.handle_process_payment,\n        }\n        \n        self.compensation_handlers = {\n            'create_user': self.compensate_create_user,\n            'create_profile': self.compensate_create_profile,\n            'send_welcome_email': self.compensate_send_welcome_email,\n            'create_order': self.compensate_create_order,\n            'reserve_inventory': self.compensate_reserve_inventory,\n            'process_payment': self.compensate_process_payment,\n        }\n    \n    def start_saga(self, saga_type, saga_data, steps):\n        \"\"\"Start a new saga\"\"\"\n        with transaction.atomic():\n            saga = Saga.objects.create(\n                saga_type=saga_type,\n                data=saga_data\n            )\n            \n            # Create saga steps\n            for i, step_config in enumerate(steps):\n                SagaStep.objects.create(\n                    saga=saga,\n                    step_name=step_config['name'],\n                    step_order=i,\n                    service_name=step_config['service'],\n                    action_data=step_config.get('data', {}),\n                    compensation_data=step_config.get('compensation_data', {})\n                )\n        \n        # Start executing saga\n        self.execute_saga(saga.id)\n        return saga\n    \n    def execute_saga(self, saga_id):\n        \"\"\"Execute saga steps\"\"\"\n        saga = Saga.objects.get(id=saga_id)\n        \n        if saga.status != SagaStatus.PENDING:\n            return\n        \n        # Get next pending step\n        next_step = saga.steps.filter(status=SagaStepStatus.PENDING).first()\n        \n        if not next_step:\n            # All steps completed\n            saga.status = SagaStatus.COMPLETED\n            saga.save()\n            logger.info(f\"Saga {saga_id} completed successfully\")\n            return\n        \n        # Execute the step\n        try:\n            self.execute_step(next_step)\n        except Exception as e:\n            logger.error(f\"Saga {saga_id} step {next_step.step_name} failed: {e}\")\n            self.handle_saga_failure(saga)\n    \n    def execute_step(self, step):\n        \"\"\"Execute a single saga step\"\"\"\n        handler = self.step_handlers.get(step.step_name)\n        if not handler:\n            raise ValueError(f\"No handler for step {step.step_name}\")\n        \n        try:\n            result = handler(step)\n            \n            step.status = SagaStepStatus.COMPLETED\n            step.result_data = result\n            step.save()\n            \n            logger.info(f\"Step {step.step_name} completed successfully\")\n            \n            # Continue with next step\n            from celery import current_app\n            current_app.send_task(\n                'saga.execute_saga',\n                args=[str(step.saga.id)],\n                countdown=1\n            )\n            \n        except Exception as e:\n            step.status = SagaStepStatus.FAILED\n            step.error_message = str(e)\n            step.save()\n            \n            raise e\n    \n    def handle_saga_failure(self, saga):\n        \"\"\"Handle saga failure by running compensations\"\"\"\n        saga.status = SagaStatus.COMPENSATING\n        saga.save()\n        \n        # Run compensations in reverse order\n        completed_steps = saga.steps.filter(\n            status=SagaStepStatus.COMPLETED\n        ).order_by('-step_order')\n        \n        for step in completed_steps:\n            try:\n                self.compensate_step(step)\n            except Exception as e:\n                logger.error(f\"Compensation failed for step {step.step_name}: {e}\")\n        \n        saga.status = SagaStatus.FAILED\n        saga.save()\n    \n    def compensate_step(self, step):\n        \"\"\"Compensate a completed step\"\"\"\n        handler = self.compensation_handlers.get(step.step_name)\n        if not handler:\n            logger.warning(f\"No compensation handler for step {step.step_name}\")\n            return\n        \n        try:\n            handler(step)\n            step.status = SagaStepStatus.COMPENSATED\n            step.save()\n            \n            logger.info(f\"Step {step.step_name} compensated successfully\")\n            \n        except Exception as e:\n            logger.error(f\"Compensation failed for step {step.step_name}: {e}\")\n            raise e\n    \n    # Step handlers\n    def handle_create_user(self, step):\n        \"\"\"Handle user creation step\"\"\"\n        user_data = step.action_data\n        \n        response = requests.post(\n            f\"{settings.USER_SERVICE_URL}/api/v1/users/\",\n            json=user_data,\n            headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n        )\n        \n        if response.status_code != 201:\n            raise Exception(f\"User creation failed: {response.status_code}\")\n        \n        return response.json()\n    \n    def handle_create_profile(self, step):\n        \"\"\"Handle profile creation step\"\"\"\n        profile_data = step.action_data\n        user_id = step.saga.data.get('user_id')\n        \n        response = requests.post(\n            f\"{settings.USER_SERVICE_URL}/api/v1/users/{user_id}/profile/\",\n            json=profile_data,\n            headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n        )\n        \n        if response.status_code != 201:\n            raise Exception(f\"Profile creation failed: {response.status_code}\")\n        \n        return response.json()\n    \n    def handle_send_welcome_email(self, step):\n        \"\"\"Handle welcome email step\"\"\"\n        email_data = step.action_data\n        \n        response = requests.post(\n            f\"{settings.NOTIFICATION_SERVICE_URL}/api/v1/emails/\",\n            json=email_data,\n            headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n        )\n        \n        if response.status_code != 202:\n            raise Exception(f\"Email sending failed: {response.status_code}\")\n        \n        return response.json()\n    \n    # Compensation handlers\n    def compensate_create_user(self, step):\n        \"\"\"Compensate user creation\"\"\"\n        user_id = step.result_data.get('id')\n        if user_id:\n            requests.delete(\n                f\"{settings.USER_SERVICE_URL}/api/v1/users/{user_id}/\",\n                headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n            )\n    \n    def compensate_create_profile(self, step):\n        \"\"\"Compensate profile creation\"\"\"\n        user_id = step.saga.data.get('user_id')\n        if user_id:\n            requests.delete(\n                f\"{settings.USER_SERVICE_URL}/api/v1/users/{user_id}/profile/\",\n                headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n            )\n    \n    def compensate_send_welcome_email(self, step):\n        \"\"\"Compensate welcome email (no-op)\"\"\"\n        # Email can't be unsent, but we could send a cancellation email\n        pass\n\n# Usage example\ndef create_user_with_profile_saga(user_data, profile_data):\n    \"\"\"Create user with profile using saga pattern\"\"\"\n    orchestrator = SagaOrchestrator()\n    \n    steps = [\n        {\n            'name': 'create_user',\n            'service': 'user-service',\n            'data': user_data\n        },\n        {\n            'name': 'create_profile',\n            'service': 'user-service',\n            'data': profile_data\n        },\n        {\n            'name': 'send_welcome_email',\n            'service': 'notification-service',\n            'data': {\n                'to': user_data['email'],\n                'template': 'welcome',\n                'data': {'username': user_data['username']}\n            }\n        }\n    ]\n    \n    saga = orchestrator.start_saga('user_registration', user_data, steps)\n    return saga\n",[1050,12415,12416,12421,12433,12451,12457,12464,12470,12474,12492,12496,12515,12538,12561,12584,12607,12611,12628,12648,12668,12688,12711,12715,12732,12741,12745,12785,12811,12863,12889,12914,12938,12942,12952,12966,12970,12987,12996,13000,13034,13083,13106,13122,13169,13192,13215,13238,13261,13286,13308,13330,13334,13342,13355,13373,13377,13386,13395,13399,13411,13424,13443,13463,13483,13503,13523,13543,13547,13551,13564,13583,13602,13621,13640,13659,13678,13682,13686,13714,13723,13737,13757,13769,13779,13783,13787,13792,13815,13830,13842,13863,13875,13894,13920,13946,13950,13954,13959,13978,13985,13989,14007,14016,14044,14048,14070,14074,14078,14083,14120,14124,14135,14140,14158,14168,14194,14198,14202,14207,14213,14229,14241,14288,14303,14307,14325,14334,14362,14373,14401,14405,14411,14426,14430,14447,14461,14471,14475,14504,14508,14513,14524,14535,14546,14571,14581,14585,14589,14601,14618,14637,14647,14651,14658,14662,14679,14688,14706,14716,14720,14725,14744,14757,14776,14780,14793,14800,14815,14828,14866,14870,14886,14896,14900,14917,14926,14952,14962,14992,14996,15000,15006,15017,15034,15044,15048,15077,15081,15093,15129,15135,15139,15144,15161,15170,15183,15187,15201,15221,15231,15253,15257,15261,15277,15304,15308,15320,15324,15342,15352,15366,15398,15403,15418,15448,15460,15483,15488,15493,15510,15538,15543,15556,15561,15579,15589,15603,15608,15623,15646,15658,15681,15686,15691,15709,15737,15742,15755,15760,15766,15784,15794,15821,15830,15842,15872,15895,15900,15905,15923,15933,15964,15973,15984,16013,16036,16041,16046,16064,16074,16080,16086,16091,16097,16116,16126,16138,16143,16154,16160,16179,16198,16211,16217,16222,16241,16260,16274,16279,16284,16303,16323,16336,16360,16381,16415,16420,16425,16431,16436,16470],{"__ignoreMap":1048},[1053,12417,12418],{"class":1055,"line":1056},[1053,12419,12420],{"class":1059},"# saga_pattern.py\n",[1053,12422,12423,12425,12428,12430],{"class":1055,"line":1063},[1053,12424,1085],{"class":1066},[1053,12426,12427],{"class":1070}," enum ",[1053,12429,1067],{"class":1066},[1053,12431,12432],{"class":1070}," Enum\n",[1053,12434,12435,12437,12439,12441,12443,12445,12447,12449],{"class":1055,"line":1074},[1053,12436,1085],{"class":1066},[1053,12438,6067],{"class":1070},[1053,12440,1191],{"class":1096},[1053,12442,7622],{"class":1070},[1053,12444,1067],{"class":1066},[1053,12446,5802],{"class":1070},[1053,12448,1097],{"class":1096},[1053,12450,7631],{"class":1070},[1053,12452,12453,12455],{"class":1055,"line":1082},[1053,12454,1067],{"class":1066},[1053,12456,7652],{"class":1070},[1053,12458,12459,12461],{"class":1055,"line":1103},[1053,12460,1067],{"class":1066},[1053,12462,12463],{"class":1070}," uuid\n",[1053,12465,12466,12468],{"class":1055,"line":1117},[1053,12467,1067],{"class":1066},[1053,12469,6128],{"class":1070},[1053,12471,12472],{"class":1055,"line":1124},[1053,12473,1121],{"emptyLinePlaceholder":1120},[1053,12475,12476,12478,12480,12482,12484,12486,12488,12490],{"class":1055,"line":1138},[1053,12477,6137],{"class":1070},[1053,12479,1521],{"class":1096},[1053,12481,6142],{"class":1070},[1053,12483,1191],{"class":1096},[1053,12485,6147],{"class":1260},[1053,12487,1168],{"class":1096},[1053,12489,6153],{"class":6152},[1053,12491,1269],{"class":1096},[1053,12493,12494],{"class":1055,"line":1152},[1053,12495,1121],{"emptyLinePlaceholder":1120},[1053,12497,12498,12500,12503,12505,12508,12510,12513],{"class":1055,"line":1158},[1053,12499,1128],{"class":1127},[1053,12501,12502],{"class":1131}," SagaStatus",[1053,12504,1168],{"class":1096},[1053,12506,1226],{"class":12507},"sYn-s",[1053,12509,1191],{"class":1096},[1053,12511,12512],{"class":12507},"TextChoices",[1053,12514,1181],{"class":1096},[1053,12516,12517,12520,12522,12524,12527,12529,12531,12533,12536],{"class":1055,"line":1184},[1053,12518,12519],{"class":1187},"    PENDING",[1053,12521,1198],{"class":1096},[1053,12523,1482],{"class":1481},[1053,12525,12526],{"class":1485},"pending",[1053,12528,1489],{"class":1481},[1053,12530,1097],{"class":1096},[1053,12532,1482],{"class":1481},[1053,12534,12535],{"class":1485},"Pending",[1053,12537,10435],{"class":1481},[1053,12539,12540,12543,12545,12547,12550,12552,12554,12556,12559],{"class":1055,"line":1204},[1053,12541,12542],{"class":1187},"    COMPLETED",[1053,12544,1198],{"class":1096},[1053,12546,1482],{"class":1481},[1053,12548,12549],{"class":1485},"completed",[1053,12551,1489],{"class":1481},[1053,12553,1097],{"class":1096},[1053,12555,1482],{"class":1481},[1053,12557,12558],{"class":1485},"Completed",[1053,12560,10435],{"class":1481},[1053,12562,12563,12566,12568,12570,12573,12575,12577,12579,12582],{"class":1055,"line":1219},[1053,12564,12565],{"class":1187},"    FAILED",[1053,12567,1198],{"class":1096},[1053,12569,1482],{"class":1481},[1053,12571,12572],{"class":1485},"failed",[1053,12574,1489],{"class":1481},[1053,12576,1097],{"class":1096},[1053,12578,1482],{"class":1481},[1053,12580,12581],{"class":1485},"Failed",[1053,12583,10435],{"class":1481},[1053,12585,12586,12589,12591,12593,12596,12598,12600,12602,12605],{"class":1055,"line":1234},[1053,12587,12588],{"class":1187},"    COMPENSATING",[1053,12590,1198],{"class":1096},[1053,12592,1482],{"class":1481},[1053,12594,12595],{"class":1485},"compensating",[1053,12597,1489],{"class":1481},[1053,12599,1097],{"class":1096},[1053,12601,1482],{"class":1481},[1053,12603,12604],{"class":1485},"Compensating",[1053,12606,10435],{"class":1481},[1053,12608,12609],{"class":1055,"line":1248},[1053,12610,1121],{"emptyLinePlaceholder":1120},[1053,12612,12613,12615,12618,12620,12622,12624,12626],{"class":1055,"line":1272},[1053,12614,1128],{"class":1127},[1053,12616,12617],{"class":1131}," SagaStepStatus",[1053,12619,1168],{"class":1096},[1053,12621,1226],{"class":12507},[1053,12623,1191],{"class":1096},[1053,12625,12512],{"class":12507},[1053,12627,1181],{"class":1096},[1053,12629,12630,12632,12634,12636,12638,12640,12642,12644,12646],{"class":1055,"line":1292},[1053,12631,12519],{"class":1187},[1053,12633,1198],{"class":1096},[1053,12635,1482],{"class":1481},[1053,12637,12526],{"class":1485},[1053,12639,1489],{"class":1481},[1053,12641,1097],{"class":1096},[1053,12643,1482],{"class":1481},[1053,12645,12535],{"class":1485},[1053,12647,10435],{"class":1481},[1053,12649,12650,12652,12654,12656,12658,12660,12662,12664,12666],{"class":1055,"line":1297},[1053,12651,12542],{"class":1187},[1053,12653,1198],{"class":1096},[1053,12655,1482],{"class":1481},[1053,12657,12549],{"class":1485},[1053,12659,1489],{"class":1481},[1053,12661,1097],{"class":1096},[1053,12663,1482],{"class":1481},[1053,12665,12558],{"class":1485},[1053,12667,10435],{"class":1481},[1053,12669,12670,12672,12674,12676,12678,12680,12682,12684,12686],{"class":1055,"line":1312},[1053,12671,12565],{"class":1187},[1053,12673,1198],{"class":1096},[1053,12675,1482],{"class":1481},[1053,12677,12572],{"class":1485},[1053,12679,1489],{"class":1481},[1053,12681,1097],{"class":1096},[1053,12683,1482],{"class":1481},[1053,12685,12581],{"class":1485},[1053,12687,10435],{"class":1481},[1053,12689,12690,12693,12695,12697,12700,12702,12704,12706,12709],{"class":1055,"line":1323},[1053,12691,12692],{"class":1187},"    COMPENSATED",[1053,12694,1198],{"class":1096},[1053,12696,1482],{"class":1481},[1053,12698,12699],{"class":1485},"compensated",[1053,12701,1489],{"class":1481},[1053,12703,1097],{"class":1096},[1053,12705,1482],{"class":1481},[1053,12707,12708],{"class":1485},"Compensated",[1053,12710,10435],{"class":1481},[1053,12712,12713],{"class":1055,"line":1336},[1053,12714,1121],{"emptyLinePlaceholder":1120},[1053,12716,12717,12719,12722,12724,12726,12728,12730],{"class":1055,"line":1348},[1053,12718,1128],{"class":1127},[1053,12720,12721],{"class":1131}," Saga",[1053,12723,1168],{"class":1096},[1053,12725,1226],{"class":12507},[1053,12727,1191],{"class":1096},[1053,12729,2362],{"class":12507},[1053,12731,1181],{"class":1096},[1053,12733,12734,12736,12739],{"class":1055,"line":1360},[1053,12735,1142],{"class":1141},[1053,12737,12738],{"class":1145},"Saga orchestration model",[1053,12740,1149],{"class":1141},[1053,12742,12743],{"class":1055,"line":1372},[1053,12744,1155],{"class":1070},[1053,12746,12747,12750,12752,12754,12756,12759,12761,12764,12766,12768,12770,12773,12775,12778,12780,12783],{"class":1055,"line":1384},[1053,12748,12749],{"class":1164},"    id",[1053,12751,1198],{"class":1096},[1053,12753,5802],{"class":1070},[1053,12755,1191],{"class":1096},[1053,12757,12758],{"class":1260},"UUIDField",[1053,12760,1168],{"class":1096},[1053,12762,12763],{"class":5736},"primary_key",[1053,12765,1521],{"class":1096},[1053,12767,5769],{"class":5768},[1053,12769,1097],{"class":1096},[1053,12771,12772],{"class":5736}," default",[1053,12774,1521],{"class":1096},[1053,12776,12777],{"class":1260},"uuid",[1053,12779,1191],{"class":1096},[1053,12781,12782],{"class":1194},"uuid4",[1053,12784,1269],{"class":1096},[1053,12786,12787,12790,12792,12794,12796,12799,12801,12804,12806,12809],{"class":1055,"line":1390},[1053,12788,12789],{"class":1070},"    saga_type ",[1053,12791,1521],{"class":1096},[1053,12793,5802],{"class":1070},[1053,12795,1191],{"class":1096},[1053,12797,12798],{"class":1260},"CharField",[1053,12800,1168],{"class":1096},[1053,12802,12803],{"class":5736},"max_length",[1053,12805,1521],{"class":1096},[1053,12807,12808],{"class":3044},"100",[1053,12810,1269],{"class":1096},[1053,12812,12813,12816,12818,12820,12822,12824,12826,12828,12830,12833,12835,12838,12840,12843,12845,12848,12850,12852,12854,12856,12858,12861],{"class":1055,"line":1406},[1053,12814,12815],{"class":1070},"    status ",[1053,12817,1521],{"class":1096},[1053,12819,5802],{"class":1070},[1053,12821,1191],{"class":1096},[1053,12823,12798],{"class":1260},[1053,12825,1168],{"class":1096},[1053,12827,12803],{"class":5736},[1053,12829,1521],{"class":1096},[1053,12831,12832],{"class":3044},"20",[1053,12834,1097],{"class":1096},[1053,12836,12837],{"class":5736}," choices",[1053,12839,1521],{"class":1096},[1053,12841,12842],{"class":1260},"SagaStatus",[1053,12844,1191],{"class":1096},[1053,12846,12847],{"class":1194},"choices",[1053,12849,1097],{"class":1096},[1053,12851,12772],{"class":5736},[1053,12853,1521],{"class":1096},[1053,12855,12842],{"class":1260},[1053,12857,1191],{"class":1096},[1053,12859,12860],{"class":6715},"PENDING",[1053,12862,1269],{"class":1096},[1053,12864,12865,12868,12870,12872,12874,12877,12879,12882,12884,12887],{"class":1055,"line":1411},[1053,12866,12867],{"class":1070},"    data ",[1053,12869,1521],{"class":1096},[1053,12871,5802],{"class":1070},[1053,12873,1191],{"class":1096},[1053,12875,12876],{"class":1260},"JSONField",[1053,12878,1168],{"class":1096},[1053,12880,12881],{"class":5736},"default",[1053,12883,1521],{"class":1096},[1053,12885,12886],{"class":1265},"dict",[1053,12888,1269],{"class":1096},[1053,12890,12891,12894,12896,12898,12900,12903,12905,12908,12910,12912],{"class":1055,"line":1425},[1053,12892,12893],{"class":1070},"    created_at ",[1053,12895,1521],{"class":1096},[1053,12897,5802],{"class":1070},[1053,12899,1191],{"class":1096},[1053,12901,12902],{"class":1260},"DateTimeField",[1053,12904,1168],{"class":1096},[1053,12906,12907],{"class":5736},"auto_now_add",[1053,12909,1521],{"class":1096},[1053,12911,5769],{"class":5768},[1053,12913,1269],{"class":1096},[1053,12915,12916,12919,12921,12923,12925,12927,12929,12932,12934,12936],{"class":1055,"line":1435},[1053,12917,12918],{"class":1070},"    updated_at ",[1053,12920,1521],{"class":1096},[1053,12922,5802],{"class":1070},[1053,12924,1191],{"class":1096},[1053,12926,12902],{"class":1260},[1053,12928,1168],{"class":1096},[1053,12930,12931],{"class":5736},"auto_now",[1053,12933,1521],{"class":1096},[1053,12935,5769],{"class":5768},[1053,12937,1269],{"class":1096},[1053,12939,12940],{"class":1055,"line":1475},[1053,12941,1155],{"class":1070},[1053,12943,12944,12947,12950],{"class":1055,"line":1515},[1053,12945,12946],{"class":1127},"    class",[1053,12948,12949],{"class":1131}," Meta",[1053,12951,1135],{"class":1096},[1053,12953,12954,12957,12959,12961,12964],{"class":1055,"line":1543},[1053,12955,12956],{"class":1070},"        db_table ",[1053,12958,1521],{"class":1096},[1053,12960,1482],{"class":1481},[1053,12962,12963],{"class":1485},"sagas",[1053,12965,10435],{"class":1481},[1053,12967,12968],{"class":1055,"line":1579},[1053,12969,1121],{"emptyLinePlaceholder":1120},[1053,12971,12972,12974,12977,12979,12981,12983,12985],{"class":1055,"line":1601},[1053,12973,1128],{"class":1127},[1053,12975,12976],{"class":1131}," SagaStep",[1053,12978,1168],{"class":1096},[1053,12980,1226],{"class":12507},[1053,12982,1191],{"class":1096},[1053,12984,2362],{"class":12507},[1053,12986,1181],{"class":1096},[1053,12988,12989,12991,12994],{"class":1055,"line":1606},[1053,12990,1142],{"class":1141},[1053,12992,12993],{"class":1145},"Individual saga step",[1053,12995,1149],{"class":1141},[1053,12997,12998],{"class":1055,"line":1620},[1053,12999,1155],{"class":1070},[1053,13001,13002,13004,13006,13008,13010,13012,13014,13016,13018,13020,13022,13024,13026,13028,13030,13032],{"class":1055,"line":1630},[1053,13003,12749],{"class":1164},[1053,13005,1198],{"class":1096},[1053,13007,5802],{"class":1070},[1053,13009,1191],{"class":1096},[1053,13011,12758],{"class":1260},[1053,13013,1168],{"class":1096},[1053,13015,12763],{"class":5736},[1053,13017,1521],{"class":1096},[1053,13019,5769],{"class":5768},[1053,13021,1097],{"class":1096},[1053,13023,12772],{"class":5736},[1053,13025,1521],{"class":1096},[1053,13027,12777],{"class":1260},[1053,13029,1191],{"class":1096},[1053,13031,12782],{"class":1194},[1053,13033,1269],{"class":1096},[1053,13035,13036,13039,13041,13043,13045,13048,13050,13053,13055,13058,13060,13062,13064,13067,13069,13072,13074,13076,13079,13081],{"class":1055,"line":1648},[1053,13037,13038],{"class":1070},"    saga ",[1053,13040,1521],{"class":1096},[1053,13042,5802],{"class":1070},[1053,13044,1191],{"class":1096},[1053,13046,13047],{"class":1260},"ForeignKey",[1053,13049,1168],{"class":1096},[1053,13051,13052],{"class":1260},"Saga",[1053,13054,1097],{"class":1096},[1053,13056,13057],{"class":5736}," on_delete",[1053,13059,1521],{"class":1096},[1053,13061,1226],{"class":1260},[1053,13063,1191],{"class":1096},[1053,13065,13066],{"class":6715},"CASCADE",[1053,13068,1097],{"class":1096},[1053,13070,13071],{"class":5736}," related_name",[1053,13073,1521],{"class":1096},[1053,13075,1489],{"class":1481},[1053,13077,13078],{"class":1485},"steps",[1053,13080,1489],{"class":1481},[1053,13082,1269],{"class":1096},[1053,13084,13085,13088,13090,13092,13094,13096,13098,13100,13102,13104],{"class":1055,"line":1690},[1053,13086,13087],{"class":1070},"    step_name ",[1053,13089,1521],{"class":1096},[1053,13091,5802],{"class":1070},[1053,13093,1191],{"class":1096},[1053,13095,12798],{"class":1260},[1053,13097,1168],{"class":1096},[1053,13099,12803],{"class":5736},[1053,13101,1521],{"class":1096},[1053,13103,12808],{"class":3044},[1053,13105,1269],{"class":1096},[1053,13107,13108,13111,13113,13115,13117,13120],{"class":1055,"line":1713},[1053,13109,13110],{"class":1070},"    step_order ",[1053,13112,1521],{"class":1096},[1053,13114,5802],{"class":1070},[1053,13116,1191],{"class":1096},[1053,13118,13119],{"class":1260},"IntegerField",[1053,13121,1333],{"class":1096},[1053,13123,13124,13126,13128,13130,13132,13134,13136,13138,13140,13142,13144,13146,13148,13151,13153,13155,13157,13159,13161,13163,13165,13167],{"class":1055,"line":1747},[1053,13125,12815],{"class":1070},[1053,13127,1521],{"class":1096},[1053,13129,5802],{"class":1070},[1053,13131,1191],{"class":1096},[1053,13133,12798],{"class":1260},[1053,13135,1168],{"class":1096},[1053,13137,12803],{"class":5736},[1053,13139,1521],{"class":1096},[1053,13141,12832],{"class":3044},[1053,13143,1097],{"class":1096},[1053,13145,12837],{"class":5736},[1053,13147,1521],{"class":1096},[1053,13149,13150],{"class":1260},"SagaStepStatus",[1053,13152,1191],{"class":1096},[1053,13154,12847],{"class":1194},[1053,13156,1097],{"class":1096},[1053,13158,12772],{"class":5736},[1053,13160,1521],{"class":1096},[1053,13162,13150],{"class":1260},[1053,13164,1191],{"class":1096},[1053,13166,12860],{"class":6715},[1053,13168,1269],{"class":1096},[1053,13170,13171,13174,13176,13178,13180,13182,13184,13186,13188,13190],{"class":1055,"line":1752},[1053,13172,13173],{"class":1070},"    service_name ",[1053,13175,1521],{"class":1096},[1053,13177,5802],{"class":1070},[1053,13179,1191],{"class":1096},[1053,13181,12798],{"class":1260},[1053,13183,1168],{"class":1096},[1053,13185,12803],{"class":5736},[1053,13187,1521],{"class":1096},[1053,13189,12808],{"class":3044},[1053,13191,1269],{"class":1096},[1053,13193,13194,13197,13199,13201,13203,13205,13207,13209,13211,13213],{"class":1055,"line":1766},[1053,13195,13196],{"class":1070},"    action_data ",[1053,13198,1521],{"class":1096},[1053,13200,5802],{"class":1070},[1053,13202,1191],{"class":1096},[1053,13204,12876],{"class":1260},[1053,13206,1168],{"class":1096},[1053,13208,12881],{"class":5736},[1053,13210,1521],{"class":1096},[1053,13212,12886],{"class":1265},[1053,13214,1269],{"class":1096},[1053,13216,13217,13220,13222,13224,13226,13228,13230,13232,13234,13236],{"class":1055,"line":1776},[1053,13218,13219],{"class":1070},"    compensation_data ",[1053,13221,1521],{"class":1096},[1053,13223,5802],{"class":1070},[1053,13225,1191],{"class":1096},[1053,13227,12876],{"class":1260},[1053,13229,1168],{"class":1096},[1053,13231,12881],{"class":5736},[1053,13233,1521],{"class":1096},[1053,13235,12886],{"class":1265},[1053,13237,1269],{"class":1096},[1053,13239,13240,13243,13245,13247,13249,13251,13253,13255,13257,13259],{"class":1055,"line":1793},[1053,13241,13242],{"class":1070},"    result_data ",[1053,13244,1521],{"class":1096},[1053,13246,5802],{"class":1070},[1053,13248,1191],{"class":1096},[1053,13250,12876],{"class":1260},[1053,13252,1168],{"class":1096},[1053,13254,12881],{"class":5736},[1053,13256,1521],{"class":1096},[1053,13258,12886],{"class":1265},[1053,13260,1269],{"class":1096},[1053,13262,13263,13266,13268,13270,13272,13275,13277,13280,13282,13284],{"class":1055,"line":1834},[1053,13264,13265],{"class":1070},"    error_message ",[1053,13267,1521],{"class":1096},[1053,13269,5802],{"class":1070},[1053,13271,1191],{"class":1096},[1053,13273,13274],{"class":1260},"TextField",[1053,13276,1168],{"class":1096},[1053,13278,13279],{"class":5736},"blank",[1053,13281,1521],{"class":1096},[1053,13283,5769],{"class":5768},[1053,13285,1269],{"class":1096},[1053,13287,13288,13290,13292,13294,13296,13298,13300,13302,13304,13306],{"class":1055,"line":1856},[1053,13289,12893],{"class":1070},[1053,13291,1521],{"class":1096},[1053,13293,5802],{"class":1070},[1053,13295,1191],{"class":1096},[1053,13297,12902],{"class":1260},[1053,13299,1168],{"class":1096},[1053,13301,12907],{"class":5736},[1053,13303,1521],{"class":1096},[1053,13305,5769],{"class":5768},[1053,13307,1269],{"class":1096},[1053,13309,13310,13312,13314,13316,13318,13320,13322,13324,13326,13328],{"class":1055,"line":1886},[1053,13311,12918],{"class":1070},[1053,13313,1521],{"class":1096},[1053,13315,5802],{"class":1070},[1053,13317,1191],{"class":1096},[1053,13319,12902],{"class":1260},[1053,13321,1168],{"class":1096},[1053,13323,12931],{"class":5736},[1053,13325,1521],{"class":1096},[1053,13327,5769],{"class":5768},[1053,13329,1269],{"class":1096},[1053,13331,13332],{"class":1055,"line":1891},[1053,13333,1155],{"class":1070},[1053,13335,13336,13338,13340],{"class":1055,"line":1905},[1053,13337,12946],{"class":1127},[1053,13339,12949],{"class":1131},[1053,13341,1135],{"class":1096},[1053,13343,13344,13346,13348,13350,13353],{"class":1055,"line":1915},[1053,13345,12956],{"class":1070},[1053,13347,1521],{"class":1096},[1053,13349,1482],{"class":1481},[1053,13351,13352],{"class":1485},"saga_steps",[1053,13354,10435],{"class":1481},[1053,13356,13357,13360,13362,13364,13366,13369,13371],{"class":1055,"line":1932},[1053,13358,13359],{"class":1070},"        ordering ",[1053,13361,1521],{"class":1096},[1053,13363,1557],{"class":1096},[1053,13365,1489],{"class":1481},[1053,13367,13368],{"class":1485},"step_order",[1053,13370,1489],{"class":1481},[1053,13372,4973],{"class":1096},[1053,13374,13375],{"class":1055,"line":1964},[1053,13376,1121],{"emptyLinePlaceholder":1120},[1053,13378,13379,13381,13384],{"class":1055,"line":1995},[1053,13380,1128],{"class":1127},[1053,13382,13383],{"class":1131}," SagaOrchestrator",[1053,13385,1135],{"class":1096},[1053,13387,13388,13390,13393],{"class":1055,"line":2011},[1053,13389,1142],{"class":1141},[1053,13391,13392],{"class":1145},"Orchestrate saga execution",[1053,13394,1149],{"class":1141},[1053,13396,13397],{"class":1055,"line":2035},[1053,13398,1155],{"class":1070},[1053,13400,13401,13403,13405,13407,13409],{"class":1055,"line":2063},[1053,13402,1161],{"class":1127},[1053,13404,1165],{"class":1164},[1053,13406,1168],{"class":1096},[1053,13408,1172],{"class":1171},[1053,13410,1181],{"class":1096},[1053,13412,13413,13415,13417,13420,13422],{"class":1055,"line":2085},[1053,13414,1188],{"class":1187},[1053,13416,1191],{"class":1096},[1053,13418,13419],{"class":1194},"step_handlers",[1053,13421,1198],{"class":1096},[1053,13423,3536],{"class":1096},[1053,13425,13426,13428,13430,13432,13434,13436,13438,13441],{"class":1055,"line":2112},[1053,13427,3542],{"class":1481},[1053,13429,9089],{"class":1485},[1053,13431,1489],{"class":1481},[1053,13433,2393],{"class":1096},[1053,13435,1396],{"class":1187},[1053,13437,1191],{"class":1096},[1053,13439,13440],{"class":1194},"handle_create_user",[1053,13442,2402],{"class":1096},[1053,13444,13445,13447,13450,13452,13454,13456,13458,13461],{"class":1055,"line":2117},[1053,13446,3542],{"class":1481},[1053,13448,13449],{"class":1485},"create_profile",[1053,13451,1489],{"class":1481},[1053,13453,2393],{"class":1096},[1053,13455,1396],{"class":1187},[1053,13457,1191],{"class":1096},[1053,13459,13460],{"class":1194},"handle_create_profile",[1053,13462,2402],{"class":1096},[1053,13464,13465,13467,13470,13472,13474,13476,13478,13481],{"class":1055,"line":2136},[1053,13466,3542],{"class":1481},[1053,13468,13469],{"class":1485},"send_welcome_email",[1053,13471,1489],{"class":1481},[1053,13473,2393],{"class":1096},[1053,13475,1396],{"class":1187},[1053,13477,1191],{"class":1096},[1053,13479,13480],{"class":1194},"handle_send_welcome_email",[1053,13482,2402],{"class":1096},[1053,13484,13485,13487,13490,13492,13494,13496,13498,13501],{"class":1055,"line":2146},[1053,13486,3542],{"class":1481},[1053,13488,13489],{"class":1485},"create_order",[1053,13491,1489],{"class":1481},[1053,13493,2393],{"class":1096},[1053,13495,1396],{"class":1187},[1053,13497,1191],{"class":1096},[1053,13499,13500],{"class":1194},"handle_create_order",[1053,13502,2402],{"class":1096},[1053,13504,13505,13507,13510,13512,13514,13516,13518,13521],{"class":1055,"line":2179},[1053,13506,3542],{"class":1481},[1053,13508,13509],{"class":1485},"reserve_inventory",[1053,13511,1489],{"class":1481},[1053,13513,2393],{"class":1096},[1053,13515,1396],{"class":1187},[1053,13517,1191],{"class":1096},[1053,13519,13520],{"class":1194},"handle_reserve_inventory",[1053,13522,2402],{"class":1096},[1053,13524,13525,13527,13530,13532,13534,13536,13538,13541],{"class":1055,"line":2196},[1053,13526,3542],{"class":1481},[1053,13528,13529],{"class":1485},"process_payment",[1053,13531,1489],{"class":1481},[1053,13533,2393],{"class":1096},[1053,13535,1396],{"class":1187},[1053,13537,1191],{"class":1096},[1053,13539,13540],{"class":1194},"handle_process_payment",[1053,13542,2402],{"class":1096},[1053,13544,13545],{"class":1055,"line":2201},[1053,13546,3818],{"class":1096},[1053,13548,13549],{"class":1055,"line":2209},[1053,13550,1387],{"class":1070},[1053,13552,13553,13555,13557,13560,13562],{"class":1055,"line":2232},[1053,13554,1188],{"class":1187},[1053,13556,1191],{"class":1096},[1053,13558,13559],{"class":1194},"compensation_handlers",[1053,13561,1198],{"class":1096},[1053,13563,3536],{"class":1096},[1053,13565,13566,13568,13570,13572,13574,13576,13578,13581],{"class":1055,"line":2242},[1053,13567,3542],{"class":1481},[1053,13569,9089],{"class":1485},[1053,13571,1489],{"class":1481},[1053,13573,2393],{"class":1096},[1053,13575,1396],{"class":1187},[1053,13577,1191],{"class":1096},[1053,13579,13580],{"class":1194},"compensate_create_user",[1053,13582,2402],{"class":1096},[1053,13584,13585,13587,13589,13591,13593,13595,13597,13600],{"class":1055,"line":2248},[1053,13586,3542],{"class":1481},[1053,13588,13449],{"class":1485},[1053,13590,1489],{"class":1481},[1053,13592,2393],{"class":1096},[1053,13594,1396],{"class":1187},[1053,13596,1191],{"class":1096},[1053,13598,13599],{"class":1194},"compensate_create_profile",[1053,13601,2402],{"class":1096},[1053,13603,13604,13606,13608,13610,13612,13614,13616,13619],{"class":1055,"line":2271},[1053,13605,3542],{"class":1481},[1053,13607,13469],{"class":1485},[1053,13609,1489],{"class":1481},[1053,13611,2393],{"class":1096},[1053,13613,1396],{"class":1187},[1053,13615,1191],{"class":1096},[1053,13617,13618],{"class":1194},"compensate_send_welcome_email",[1053,13620,2402],{"class":1096},[1053,13622,13623,13625,13627,13629,13631,13633,13635,13638],{"class":1055,"line":2295},[1053,13624,3542],{"class":1481},[1053,13626,13489],{"class":1485},[1053,13628,1489],{"class":1481},[1053,13630,2393],{"class":1096},[1053,13632,1396],{"class":1187},[1053,13634,1191],{"class":1096},[1053,13636,13637],{"class":1194},"compensate_create_order",[1053,13639,2402],{"class":1096},[1053,13641,13642,13644,13646,13648,13650,13652,13654,13657],{"class":1055,"line":2301},[1053,13643,3542],{"class":1481},[1053,13645,13509],{"class":1485},[1053,13647,1489],{"class":1481},[1053,13649,2393],{"class":1096},[1053,13651,1396],{"class":1187},[1053,13653,1191],{"class":1096},[1053,13655,13656],{"class":1194},"compensate_reserve_inventory",[1053,13658,2402],{"class":1096},[1053,13660,13661,13663,13665,13667,13669,13671,13673,13676],{"class":1055,"line":2322},[1053,13662,3542],{"class":1481},[1053,13664,13529],{"class":1485},[1053,13666,1489],{"class":1481},[1053,13668,2393],{"class":1096},[1053,13670,1396],{"class":1187},[1053,13672,1191],{"class":1096},[1053,13674,13675],{"class":1194},"compensate_process_payment",[1053,13677,2402],{"class":1096},[1053,13679,13680],{"class":1055,"line":2369},[1053,13681,3818],{"class":1096},[1053,13683,13684],{"class":1055,"line":2382},[1053,13685,1155],{"class":1070},[1053,13687,13688,13690,13693,13695,13697,13699,13702,13704,13707,13709,13712],{"class":1055,"line":2405},[1053,13689,1161],{"class":1127},[1053,13691,13692],{"class":1302}," start_saga",[1053,13694,1168],{"class":1096},[1053,13696,1172],{"class":1171},[1053,13698,1097],{"class":1096},[1053,13700,13701],{"class":1177}," saga_type",[1053,13703,1097],{"class":1096},[1053,13705,13706],{"class":1177}," saga_data",[1053,13708,1097],{"class":1096},[1053,13710,13711],{"class":1177}," steps",[1053,13713,1181],{"class":1096},[1053,13715,13716,13718,13721],{"class":1055,"line":2431},[1053,13717,1315],{"class":1141},[1053,13719,13720],{"class":1145},"Start a new saga",[1053,13722,1149],{"class":1141},[1053,13724,13725,13727,13730,13732,13735],{"class":1055,"line":2488},[1053,13726,2149],{"class":1066},[1053,13728,13729],{"class":1070}," transaction",[1053,13731,1191],{"class":1096},[1053,13733,13734],{"class":1260},"atomic",[1053,13736,4219],{"class":1096},[1053,13738,13739,13742,13744,13746,13748,13750,13752,13755],{"class":1055,"line":2494},[1053,13740,13741],{"class":1070},"            saga ",[1053,13743,1521],{"class":1096},[1053,13745,12721],{"class":1070},[1053,13747,1191],{"class":1096},[1053,13749,7812],{"class":1194},[1053,13751,1191],{"class":1096},[1053,13753,13754],{"class":1260},"create",[1053,13756,5688],{"class":1096},[1053,13758,13759,13762,13764,13767],{"class":1055,"line":2499},[1053,13760,13761],{"class":5736},"                saga_type",[1053,13763,1521],{"class":1096},[1053,13765,13766],{"class":1260},"saga_type",[1053,13768,2402],{"class":1096},[1053,13770,13771,13774,13776],{"class":1055,"line":2508},[1053,13772,13773],{"class":5736},"                data",[1053,13775,1521],{"class":1096},[1053,13777,13778],{"class":1260},"saga_data\n",[1053,13780,13781],{"class":1055,"line":2519},[1053,13782,7015],{"class":1096},[1053,13784,13785],{"class":1055,"line":2526},[1053,13786,2245],{"class":1070},[1053,13788,13789],{"class":1055,"line":2531},[1053,13790,13791],{"class":1059},"            # Create saga steps\n",[1053,13793,13794,13796,13799,13801,13804,13806,13809,13811,13813],{"class":1055,"line":2550},[1053,13795,1967],{"class":1066},[1053,13797,13798],{"class":1070}," i",[1053,13800,1097],{"class":1096},[1053,13802,13803],{"class":1070}," step_config ",[1053,13805,1454],{"class":1066},[1053,13807,13808],{"class":1164}," enumerate",[1053,13810,1168],{"class":1096},[1053,13812,13078],{"class":1260},[1053,13814,1181],{"class":1096},[1053,13816,13817,13820,13822,13824,13826,13828],{"class":1055,"line":2560},[1053,13818,13819],{"class":1070},"                SagaStep",[1053,13821,1191],{"class":1096},[1053,13823,7812],{"class":1194},[1053,13825,1191],{"class":1096},[1053,13827,13754],{"class":1260},[1053,13829,5688],{"class":1096},[1053,13831,13832,13835,13837,13840],{"class":1055,"line":2570},[1053,13833,13834],{"class":5736},"                    saga",[1053,13836,1521],{"class":1096},[1053,13838,13839],{"class":1260},"saga",[1053,13841,2402],{"class":1096},[1053,13843,13844,13847,13849,13852,13854,13856,13858,13860],{"class":1055,"line":2587},[1053,13845,13846],{"class":5736},"                    step_name",[1053,13848,1521],{"class":1096},[1053,13850,13851],{"class":1260},"step_config",[1053,13853,1723],{"class":1096},[1053,13855,1489],{"class":1481},[1053,13857,2388],{"class":1485},[1053,13859,1489],{"class":1481},[1053,13861,13862],{"class":1096},"],\n",[1053,13864,13865,13868,13870,13873],{"class":1055,"line":2609},[1053,13866,13867],{"class":5736},"                    step_order",[1053,13869,1521],{"class":1096},[1053,13871,13872],{"class":1260},"i",[1053,13874,2402],{"class":1096},[1053,13876,13877,13880,13882,13884,13886,13888,13890,13892],{"class":1055,"line":2628},[1053,13878,13879],{"class":5736},"                    service_name",[1053,13881,1521],{"class":1096},[1053,13883,13851],{"class":1260},[1053,13885,1723],{"class":1096},[1053,13887,1489],{"class":1481},[1053,13889,10064],{"class":1485},[1053,13891,1489],{"class":1481},[1053,13893,13862],{"class":1096},[1053,13895,13896,13899,13901,13903,13905,13907,13909,13911,13913,13915,13917],{"class":1055,"line":2651},[1053,13897,13898],{"class":5736},"                    action_data",[1053,13900,1521],{"class":1096},[1053,13902,13851],{"class":1260},[1053,13904,1191],{"class":1096},[1053,13906,4357],{"class":1260},[1053,13908,1168],{"class":1096},[1053,13910,1489],{"class":1481},[1053,13912,10107],{"class":1485},[1053,13914,1489],{"class":1481},[1053,13916,1097],{"class":1096},[1053,13918,13919],{"class":1096}," {}),\n",[1053,13921,13922,13925,13927,13929,13931,13933,13935,13937,13940,13942,13944],{"class":1055,"line":2672},[1053,13923,13924],{"class":5736},"                    compensation_data",[1053,13926,1521],{"class":1096},[1053,13928,13851],{"class":1260},[1053,13930,1191],{"class":1096},[1053,13932,4357],{"class":1260},[1053,13934,1168],{"class":1096},[1053,13936,1489],{"class":1481},[1053,13938,13939],{"class":1485},"compensation_data",[1053,13941,1489],{"class":1481},[1053,13943,1097],{"class":1096},[1053,13945,6245],{"class":1096},[1053,13947,13948],{"class":1055,"line":2680},[1053,13949,5707],{"class":1096},[1053,13951,13952],{"class":1055,"line":2685},[1053,13953,1387],{"class":1070},[1053,13955,13956],{"class":1055,"line":2704},[1053,13957,13958],{"class":1059},"        # Start executing saga\n",[1053,13960,13961,13963,13965,13968,13970,13972,13974,13976],{"class":1055,"line":2714},[1053,13962,1188],{"class":1187},[1053,13964,1191],{"class":1096},[1053,13966,13967],{"class":1260},"execute_saga",[1053,13969,1168],{"class":1096},[1053,13971,13839],{"class":1260},[1053,13973,1191],{"class":1096},[1053,13975,2667],{"class":1194},[1053,13977,1269],{"class":1096},[1053,13979,13980,13982],{"class":1055,"line":2741},[1053,13981,1393],{"class":1066},[1053,13983,13984],{"class":1070}," saga\n",[1053,13986,13987],{"class":1055,"line":2756},[1053,13988,1155],{"class":1070},[1053,13990,13991,13993,13996,13998,14000,14002,14005],{"class":1055,"line":2761},[1053,13992,1161],{"class":1127},[1053,13994,13995],{"class":1302}," execute_saga",[1053,13997,1168],{"class":1096},[1053,13999,1172],{"class":1171},[1053,14001,1097],{"class":1096},[1053,14003,14004],{"class":1177}," saga_id",[1053,14006,1181],{"class":1096},[1053,14008,14009,14011,14014],{"class":1055,"line":2768},[1053,14010,1315],{"class":1141},[1053,14012,14013],{"class":1145},"Execute saga steps",[1053,14015,1149],{"class":1141},[1053,14017,14018,14021,14023,14025,14027,14029,14031,14033,14035,14037,14039,14042],{"class":1055,"line":2787},[1053,14019,14020],{"class":1070},"        saga ",[1053,14022,1521],{"class":1096},[1053,14024,12721],{"class":1070},[1053,14026,1191],{"class":1096},[1053,14028,7812],{"class":1194},[1053,14030,1191],{"class":1096},[1053,14032,4357],{"class":1260},[1053,14034,1168],{"class":1096},[1053,14036,2667],{"class":5736},[1053,14038,1521],{"class":1096},[1053,14040,14041],{"class":1260},"saga_id",[1053,14043,1269],{"class":1096},[1053,14045,14046],{"class":1055,"line":2797},[1053,14047,1387],{"class":1070},[1053,14049,14050,14052,14055,14057,14060,14062,14064,14066,14068],{"class":1055,"line":2802},[1053,14051,6302],{"class":1066},[1053,14053,14054],{"class":1070}," saga",[1053,14056,1191],{"class":1096},[1053,14058,14059],{"class":1194},"status",[1053,14061,8494],{"class":1492},[1053,14063,12502],{"class":1070},[1053,14065,1191],{"class":1096},[1053,14067,12860],{"class":6715},[1053,14069,1135],{"class":1096},[1053,14071,14072],{"class":1055,"line":2823},[1053,14073,10029],{"class":1066},[1053,14075,14076],{"class":1055,"line":2863},[1053,14077,1387],{"class":1070},[1053,14079,14080],{"class":1055,"line":2875},[1053,14081,14082],{"class":1059},"        # Get next pending step\n",[1053,14084,14085,14088,14090,14092,14094,14096,14098,14101,14103,14105,14107,14109,14111,14113,14115,14118],{"class":1055,"line":2895},[1053,14086,14087],{"class":1070},"        next_step ",[1053,14089,1521],{"class":1096},[1053,14091,14054],{"class":1070},[1053,14093,1191],{"class":1096},[1053,14095,13078],{"class":1194},[1053,14097,1191],{"class":1096},[1053,14099,14100],{"class":1260},"filter",[1053,14102,1168],{"class":1096},[1053,14104,14059],{"class":5736},[1053,14106,1521],{"class":1096},[1053,14108,13150],{"class":1260},[1053,14110,1191],{"class":1096},[1053,14112,12860],{"class":6715},[1053,14114,7366],{"class":1096},[1053,14116,14117],{"class":1260},"first",[1053,14119,1333],{"class":1096},[1053,14121,14122],{"class":1055,"line":2943},[1053,14123,1387],{"class":1070},[1053,14125,14126,14128,14130,14133],{"class":1055,"line":2968},[1053,14127,6302],{"class":1066},[1053,14129,7068],{"class":1492},[1053,14131,14132],{"class":1070}," next_step",[1053,14134,1135],{"class":1096},[1053,14136,14137],{"class":1055,"line":2974},[1053,14138,14139],{"class":1059},"            # All steps completed\n",[1053,14141,14142,14145,14147,14149,14151,14153,14155],{"class":1055,"line":2979},[1053,14143,14144],{"class":1070},"            saga",[1053,14146,1191],{"class":1096},[1053,14148,14059],{"class":1194},[1053,14150,1198],{"class":1096},[1053,14152,12502],{"class":1070},[1053,14154,1191],{"class":1096},[1053,14156,14157],{"class":6715},"COMPLETED\n",[1053,14159,14160,14162,14164,14166],{"class":1055,"line":2987},[1053,14161,14144],{"class":1070},[1053,14163,1191],{"class":1096},[1053,14165,9231],{"class":1260},[1053,14167,1333],{"class":1096},[1053,14169,14170,14172,14174,14176,14178,14180,14183,14185,14187,14189,14192],{"class":1055,"line":2996},[1053,14171,7116],{"class":1070},[1053,14173,1191],{"class":1096},[1053,14175,7121],{"class":1260},[1053,14177,1168],{"class":1096},[1053,14179,3879],{"class":1127},[1053,14181,14182],{"class":1485},"\"Saga ",[1053,14184,3886],{"class":3885},[1053,14186,14041],{"class":1260},[1053,14188,3907],{"class":3885},[1053,14190,14191],{"class":1485}," completed successfully\"",[1053,14193,1269],{"class":1096},[1053,14195,14196],{"class":1055,"line":3003},[1053,14197,10029],{"class":1066},[1053,14199,14200],{"class":1055,"line":3008},[1053,14201,1387],{"class":1070},[1053,14203,14204],{"class":1055,"line":3026},[1053,14205,14206],{"class":1059},"        # Execute the step\n",[1053,14208,14209,14211],{"class":1055,"line":3036},[1053,14210,2204],{"class":1066},[1053,14212,1135],{"class":1096},[1053,14214,14215,14217,14219,14222,14224,14227],{"class":1055,"line":3048},[1053,14216,4417],{"class":1187},[1053,14218,1191],{"class":1096},[1053,14220,14221],{"class":1260},"execute_step",[1053,14223,1168],{"class":1096},[1053,14225,14226],{"class":1260},"next_step",[1053,14228,1269],{"class":1096},[1053,14230,14231,14233,14235,14237,14239],{"class":1055,"line":3070},[1053,14232,2511],{"class":1066},[1053,14234,7984],{"class":1265},[1053,14236,2171],{"class":1066},[1053,14238,7181],{"class":1070},[1053,14240,1135],{"class":1096},[1053,14242,14243,14245,14247,14249,14251,14253,14255,14257,14259,14261,14264,14266,14268,14270,14273,14275,14278,14280,14282,14284,14286],{"class":1055,"line":3134},[1053,14244,7116],{"class":1070},[1053,14246,1191],{"class":1096},[1053,14248,7192],{"class":1260},[1053,14250,1168],{"class":1096},[1053,14252,3879],{"class":1127},[1053,14254,14182],{"class":1485},[1053,14256,3886],{"class":3885},[1053,14258,14041],{"class":1260},[1053,14260,3907],{"class":3885},[1053,14262,14263],{"class":1485}," step ",[1053,14265,3886],{"class":3885},[1053,14267,14226],{"class":1260},[1053,14269,1191],{"class":1096},[1053,14271,14272],{"class":1194},"step_name",[1053,14274,3907],{"class":3885},[1053,14276,14277],{"class":1485}," failed: ",[1053,14279,3886],{"class":3885},[1053,14281,7204],{"class":1260},[1053,14283,3907],{"class":3885},[1053,14285,5467],{"class":1485},[1053,14287,1269],{"class":1096},[1053,14289,14290,14292,14294,14297,14299,14301],{"class":1055,"line":3145},[1053,14291,4417],{"class":1187},[1053,14293,1191],{"class":1096},[1053,14295,14296],{"class":1260},"handle_saga_failure",[1053,14298,1168],{"class":1096},[1053,14300,13839],{"class":1260},[1053,14302,1269],{"class":1096},[1053,14304,14305],{"class":1055,"line":3153},[1053,14306,1155],{"class":1070},[1053,14308,14309,14311,14314,14316,14318,14320,14323],{"class":1055,"line":3158},[1053,14310,1161],{"class":1127},[1053,14312,14313],{"class":1302}," execute_step",[1053,14315,1168],{"class":1096},[1053,14317,1172],{"class":1171},[1053,14319,1097],{"class":1096},[1053,14321,14322],{"class":1177}," step",[1053,14324,1181],{"class":1096},[1053,14326,14327,14329,14332],{"class":1055,"line":3177},[1053,14328,1315],{"class":1141},[1053,14330,14331],{"class":1145},"Execute a single saga step",[1053,14333,1149],{"class":1141},[1053,14335,14336,14339,14341,14343,14345,14347,14349,14351,14353,14356,14358,14360],{"class":1055,"line":3187},[1053,14337,14338],{"class":1070},"        handler ",[1053,14340,1521],{"class":1096},[1053,14342,1396],{"class":1187},[1053,14344,1191],{"class":1096},[1053,14346,13419],{"class":1194},[1053,14348,1191],{"class":1096},[1053,14350,4357],{"class":1260},[1053,14352,1168],{"class":1096},[1053,14354,14355],{"class":1260},"step",[1053,14357,1191],{"class":1096},[1053,14359,14272],{"class":1194},[1053,14361,1269],{"class":1096},[1053,14363,14364,14366,14368,14371],{"class":1055,"line":3200},[1053,14365,6302],{"class":1066},[1053,14367,7068],{"class":1492},[1053,14369,14370],{"class":1070}," handler",[1053,14372,1135],{"class":1096},[1053,14374,14375,14377,14380,14382,14384,14387,14389,14391,14393,14395,14397,14399],{"class":1055,"line":3205},[1053,14376,8504],{"class":1066},[1053,14378,14379],{"class":1265}," ValueError",[1053,14381,1168],{"class":1096},[1053,14383,3879],{"class":1127},[1053,14385,14386],{"class":1485},"\"No handler for step ",[1053,14388,3886],{"class":3885},[1053,14390,14355],{"class":1260},[1053,14392,1191],{"class":1096},[1053,14394,14272],{"class":1194},[1053,14396,3907],{"class":3885},[1053,14398,5467],{"class":1485},[1053,14400,1269],{"class":1096},[1053,14402,14403],{"class":1055,"line":3212},[1053,14404,1387],{"class":1070},[1053,14406,14407,14409],{"class":1055,"line":3240},[1053,14408,2204],{"class":1066},[1053,14410,1135],{"class":1096},[1053,14412,14413,14416,14418,14420,14422,14424],{"class":1055,"line":3256},[1053,14414,14415],{"class":1070},"            result ",[1053,14417,1521],{"class":1096},[1053,14419,14370],{"class":1260},[1053,14421,1168],{"class":1096},[1053,14423,14355],{"class":1260},[1053,14425,1269],{"class":1096},[1053,14427,14428],{"class":1055,"line":3261},[1053,14429,2245],{"class":1070},[1053,14431,14432,14435,14437,14439,14441,14443,14445],{"class":1055,"line":3280},[1053,14433,14434],{"class":1070},"            step",[1053,14436,1191],{"class":1096},[1053,14438,14059],{"class":1194},[1053,14440,1198],{"class":1096},[1053,14442,12617],{"class":1070},[1053,14444,1191],{"class":1096},[1053,14446,14157],{"class":6715},[1053,14448,14449,14451,14453,14456,14458],{"class":1055,"line":3285},[1053,14450,14434],{"class":1070},[1053,14452,1191],{"class":1096},[1053,14454,14455],{"class":1194},"result_data",[1053,14457,1198],{"class":1096},[1053,14459,14460],{"class":1070}," result\n",[1053,14462,14463,14465,14467,14469],{"class":1055,"line":3306},[1053,14464,14434],{"class":1070},[1053,14466,1191],{"class":1096},[1053,14468,9231],{"class":1260},[1053,14470,1333],{"class":1096},[1053,14472,14473],{"class":1055,"line":3328},[1053,14474,2245],{"class":1070},[1053,14476,14477,14479,14481,14483,14485,14487,14490,14492,14494,14496,14498,14500,14502],{"class":1055,"line":3347},[1053,14478,7116],{"class":1070},[1053,14480,1191],{"class":1096},[1053,14482,7121],{"class":1260},[1053,14484,1168],{"class":1096},[1053,14486,3879],{"class":1127},[1053,14488,14489],{"class":1485},"\"Step ",[1053,14491,3886],{"class":3885},[1053,14493,14355],{"class":1260},[1053,14495,1191],{"class":1096},[1053,14497,14272],{"class":1194},[1053,14499,3907],{"class":3885},[1053,14501,14191],{"class":1485},[1053,14503,1269],{"class":1096},[1053,14505,14506],{"class":1055,"line":3389},[1053,14507,2245],{"class":1070},[1053,14509,14510],{"class":1055,"line":3412},[1053,14511,14512],{"class":1059},"            # Continue with next step\n",[1053,14514,14515,14518,14520,14522],{"class":1055,"line":3426},[1053,14516,14517],{"class":1066},"            from",[1053,14519,8790],{"class":1070},[1053,14521,1067],{"class":1066},[1053,14523,8795],{"class":1070},[1053,14525,14526,14529,14531,14533],{"class":1055,"line":3461},[1053,14527,14528],{"class":1070},"            current_app",[1053,14530,1191],{"class":1096},[1053,14532,8805],{"class":1260},[1053,14534,5688],{"class":1096},[1053,14536,14537,14539,14542,14544],{"class":1055,"line":3466},[1053,14538,5594],{"class":1481},[1053,14540,14541],{"class":1485},"saga.execute_saga",[1053,14543,1489],{"class":1481},[1053,14545,2402],{"class":1096},[1053,14547,14548,14551,14553,14556,14558,14560,14562,14564,14566,14568],{"class":1055,"line":3483},[1053,14549,14550],{"class":5736},"                args",[1053,14552,8826],{"class":1096},[1053,14554,14555],{"class":1265},"str",[1053,14557,1168],{"class":1096},[1053,14559,14355],{"class":1260},[1053,14561,1191],{"class":1096},[1053,14563,13839],{"class":1194},[1053,14565,1191],{"class":1096},[1053,14567,2667],{"class":1194},[1053,14569,14570],{"class":1096},")],\n",[1053,14572,14573,14576,14578],{"class":1055,"line":3489},[1053,14574,14575],{"class":5736},"                countdown",[1053,14577,1521],{"class":1096},[1053,14579,14580],{"class":3044},"1\n",[1053,14582,14583],{"class":1055,"line":3494},[1053,14584,7015],{"class":1096},[1053,14586,14587],{"class":1055,"line":3502},[1053,14588,2245],{"class":1070},[1053,14590,14591,14593,14595,14597,14599],{"class":1055,"line":3507},[1053,14592,2511],{"class":1066},[1053,14594,7984],{"class":1265},[1053,14596,2171],{"class":1066},[1053,14598,7181],{"class":1070},[1053,14600,1135],{"class":1096},[1053,14602,14603,14605,14607,14609,14611,14613,14615],{"class":1055,"line":3521},[1053,14604,14434],{"class":1070},[1053,14606,1191],{"class":1096},[1053,14608,14059],{"class":1194},[1053,14610,1198],{"class":1096},[1053,14612,12617],{"class":1070},[1053,14614,1191],{"class":1096},[1053,14616,14617],{"class":6715},"FAILED\n",[1053,14619,14620,14622,14624,14627,14629,14631,14633,14635],{"class":1055,"line":3531},[1053,14621,14434],{"class":1070},[1053,14623,1191],{"class":1096},[1053,14625,14626],{"class":1194},"error_message",[1053,14628,1198],{"class":1096},[1053,14630,8094],{"class":1265},[1053,14632,1168],{"class":1096},[1053,14634,7204],{"class":1260},[1053,14636,1269],{"class":1096},[1053,14638,14639,14641,14643,14645],{"class":1055,"line":3539},[1053,14640,14434],{"class":1070},[1053,14642,1191],{"class":1096},[1053,14644,9231],{"class":1260},[1053,14646,1333],{"class":1096},[1053,14648,14649],{"class":1055,"line":3559},[1053,14650,2245],{"class":1070},[1053,14652,14653,14655],{"class":1055,"line":3606},[1053,14654,8504],{"class":1066},[1053,14656,14657],{"class":1070}," e\n",[1053,14659,14660],{"class":1055,"line":3649},[1053,14661,1155],{"class":1070},[1053,14663,14664,14666,14669,14671,14673,14675,14677],{"class":1055,"line":3674},[1053,14665,1161],{"class":1127},[1053,14667,14668],{"class":1302}," handle_saga_failure",[1053,14670,1168],{"class":1096},[1053,14672,1172],{"class":1171},[1053,14674,1097],{"class":1096},[1053,14676,14054],{"class":1177},[1053,14678,1181],{"class":1096},[1053,14680,14681,14683,14686],{"class":1055,"line":3688},[1053,14682,1315],{"class":1141},[1053,14684,14685],{"class":1145},"Handle saga failure by running compensations",[1053,14687,1149],{"class":1141},[1053,14689,14690,14693,14695,14697,14699,14701,14703],{"class":1055,"line":3725},[1053,14691,14692],{"class":1070},"        saga",[1053,14694,1191],{"class":1096},[1053,14696,14059],{"class":1194},[1053,14698,1198],{"class":1096},[1053,14700,12502],{"class":1070},[1053,14702,1191],{"class":1096},[1053,14704,14705],{"class":6715},"COMPENSATING\n",[1053,14707,14708,14710,14712,14714],{"class":1055,"line":3751},[1053,14709,14692],{"class":1070},[1053,14711,1191],{"class":1096},[1053,14713,9231],{"class":1260},[1053,14715,1333],{"class":1096},[1053,14717,14718],{"class":1055,"line":3757},[1053,14719,1387],{"class":1070},[1053,14721,14722],{"class":1055,"line":3771},[1053,14723,14724],{"class":1059},"        # Run compensations in reverse order\n",[1053,14726,14727,14730,14732,14734,14736,14738,14740,14742],{"class":1055,"line":3809},[1053,14728,14729],{"class":1070},"        completed_steps ",[1053,14731,1521],{"class":1096},[1053,14733,14054],{"class":1070},[1053,14735,1191],{"class":1096},[1053,14737,13078],{"class":1194},[1053,14739,1191],{"class":1096},[1053,14741,14100],{"class":1260},[1053,14743,5688],{"class":1096},[1053,14745,14746,14749,14751,14753,14755],{"class":1055,"line":3815},[1053,14747,14748],{"class":5736},"            status",[1053,14750,1521],{"class":1096},[1053,14752,13150],{"class":1260},[1053,14754,1191],{"class":1096},[1053,14756,14157],{"class":6715},[1053,14758,14759,14762,14765,14767,14769,14772,14774],{"class":1055,"line":3821},[1053,14760,14761],{"class":1096},"        ).",[1053,14763,14764],{"class":1260},"order_by",[1053,14766,1168],{"class":1096},[1053,14768,1489],{"class":1481},[1053,14770,14771],{"class":1485},"-step_order",[1053,14773,1489],{"class":1481},[1053,14775,1269],{"class":1096},[1053,14777,14778],{"class":1055,"line":3826},[1053,14779,1387],{"class":1070},[1053,14781,14782,14784,14786,14788,14791],{"class":1055,"line":3832},[1053,14783,1438],{"class":1066},[1053,14785,14263],{"class":1070},[1053,14787,1454],{"class":1066},[1053,14789,14790],{"class":1070}," completed_steps",[1053,14792,1135],{"class":1096},[1053,14794,14795,14798],{"class":1055,"line":3853},[1053,14796,14797],{"class":1066},"            try",[1053,14799,1135],{"class":1096},[1053,14801,14802,14804,14806,14809,14811,14813],{"class":1055,"line":3871},[1053,14803,1716],{"class":1187},[1053,14805,1191],{"class":1096},[1053,14807,14808],{"class":1260},"compensate_step",[1053,14810,1168],{"class":1096},[1053,14812,14355],{"class":1260},[1053,14814,1269],{"class":1096},[1053,14816,14817,14820,14822,14824,14826],{"class":1055,"line":11771},[1053,14818,14819],{"class":1066},"            except",[1053,14821,7984],{"class":1265},[1053,14823,2171],{"class":1066},[1053,14825,7181],{"class":1070},[1053,14827,1135],{"class":1096},[1053,14829,14830,14833,14835,14837,14839,14841,14844,14846,14848,14850,14852,14854,14856,14858,14860,14862,14864],{"class":1055,"line":11793},[1053,14831,14832],{"class":1070},"                logger",[1053,14834,1191],{"class":1096},[1053,14836,7192],{"class":1260},[1053,14838,1168],{"class":1096},[1053,14840,3879],{"class":1127},[1053,14842,14843],{"class":1485},"\"Compensation failed for step ",[1053,14845,3886],{"class":3885},[1053,14847,14355],{"class":1260},[1053,14849,1191],{"class":1096},[1053,14851,14272],{"class":1194},[1053,14853,3907],{"class":3885},[1053,14855,8019],{"class":1485},[1053,14857,3886],{"class":3885},[1053,14859,7204],{"class":1260},[1053,14861,3907],{"class":3885},[1053,14863,5467],{"class":1485},[1053,14865,1269],{"class":1096},[1053,14867,14868],{"class":1055,"line":11813},[1053,14869,1387],{"class":1070},[1053,14871,14872,14874,14876,14878,14880,14882,14884],{"class":1055,"line":11818},[1053,14873,14692],{"class":1070},[1053,14875,1191],{"class":1096},[1053,14877,14059],{"class":1194},[1053,14879,1198],{"class":1096},[1053,14881,12502],{"class":1070},[1053,14883,1191],{"class":1096},[1053,14885,14617],{"class":6715},[1053,14887,14888,14890,14892,14894],{"class":1055,"line":11840},[1053,14889,14692],{"class":1070},[1053,14891,1191],{"class":1096},[1053,14893,9231],{"class":1260},[1053,14895,1333],{"class":1096},[1053,14897,14898],{"class":1055,"line":11856},[1053,14899,1155],{"class":1070},[1053,14901,14902,14904,14907,14909,14911,14913,14915],{"class":1055,"line":11878},[1053,14903,1161],{"class":1127},[1053,14905,14906],{"class":1302}," compensate_step",[1053,14908,1168],{"class":1096},[1053,14910,1172],{"class":1171},[1053,14912,1097],{"class":1096},[1053,14914,14322],{"class":1177},[1053,14916,1181],{"class":1096},[1053,14918,14919,14921,14924],{"class":1055,"line":11894},[1053,14920,1315],{"class":1141},[1053,14922,14923],{"class":1145},"Compensate a completed step",[1053,14925,1149],{"class":1141},[1053,14927,14928,14930,14932,14934,14936,14938,14940,14942,14944,14946,14948,14950],{"class":1055,"line":11899},[1053,14929,14338],{"class":1070},[1053,14931,1521],{"class":1096},[1053,14933,1396],{"class":1187},[1053,14935,1191],{"class":1096},[1053,14937,13559],{"class":1194},[1053,14939,1191],{"class":1096},[1053,14941,4357],{"class":1260},[1053,14943,1168],{"class":1096},[1053,14945,14355],{"class":1260},[1053,14947,1191],{"class":1096},[1053,14949,14272],{"class":1194},[1053,14951,1269],{"class":1096},[1053,14953,14954,14956,14958,14960],{"class":1055,"line":11905},[1053,14955,6302],{"class":1066},[1053,14957,7068],{"class":1492},[1053,14959,14370],{"class":1070},[1053,14961,1135],{"class":1096},[1053,14963,14964,14966,14968,14971,14973,14975,14978,14980,14982,14984,14986,14988,14990],{"class":1055,"line":11931},[1053,14965,7116],{"class":1070},[1053,14967,1191],{"class":1096},[1053,14969,14970],{"class":1260},"warning",[1053,14972,1168],{"class":1096},[1053,14974,3879],{"class":1127},[1053,14976,14977],{"class":1485},"\"No compensation handler for step ",[1053,14979,3886],{"class":3885},[1053,14981,14355],{"class":1260},[1053,14983,1191],{"class":1096},[1053,14985,14272],{"class":1194},[1053,14987,3907],{"class":3885},[1053,14989,5467],{"class":1485},[1053,14991,1269],{"class":1096},[1053,14993,14994],{"class":1055,"line":11936},[1053,14995,10029],{"class":1066},[1053,14997,14998],{"class":1055,"line":11949},[1053,14999,1387],{"class":1070},[1053,15001,15002,15004],{"class":1055,"line":11975},[1053,15003,2204],{"class":1066},[1053,15005,1135],{"class":1096},[1053,15007,15008,15011,15013,15015],{"class":1055,"line":11981},[1053,15009,15010],{"class":1260},"            handler",[1053,15012,1168],{"class":1096},[1053,15014,14355],{"class":1260},[1053,15016,1269],{"class":1096},[1053,15018,15019,15021,15023,15025,15027,15029,15031],{"class":1055,"line":12014},[1053,15020,14434],{"class":1070},[1053,15022,1191],{"class":1096},[1053,15024,14059],{"class":1194},[1053,15026,1198],{"class":1096},[1053,15028,12617],{"class":1070},[1053,15030,1191],{"class":1096},[1053,15032,15033],{"class":6715},"COMPENSATED\n",[1053,15035,15036,15038,15040,15042],{"class":1055,"line":12019},[1053,15037,14434],{"class":1070},[1053,15039,1191],{"class":1096},[1053,15041,9231],{"class":1260},[1053,15043,1333],{"class":1096},[1053,15045,15046],{"class":1055,"line":12037},[1053,15047,2245],{"class":1070},[1053,15049,15050,15052,15054,15056,15058,15060,15062,15064,15066,15068,15070,15072,15075],{"class":1055,"line":12047},[1053,15051,7116],{"class":1070},[1053,15053,1191],{"class":1096},[1053,15055,7121],{"class":1260},[1053,15057,1168],{"class":1096},[1053,15059,3879],{"class":1127},[1053,15061,14489],{"class":1485},[1053,15063,3886],{"class":3885},[1053,15065,14355],{"class":1260},[1053,15067,1191],{"class":1096},[1053,15069,14272],{"class":1194},[1053,15071,3907],{"class":3885},[1053,15073,15074],{"class":1485}," compensated successfully\"",[1053,15076,1269],{"class":1096},[1053,15078,15079],{"class":1055,"line":12067},[1053,15080,2245],{"class":1070},[1053,15082,15083,15085,15087,15089,15091],{"class":1055,"line":12086},[1053,15084,2511],{"class":1066},[1053,15086,7984],{"class":1265},[1053,15088,2171],{"class":1066},[1053,15090,7181],{"class":1070},[1053,15092,1135],{"class":1096},[1053,15094,15095,15097,15099,15101,15103,15105,15107,15109,15111,15113,15115,15117,15119,15121,15123,15125,15127],{"class":1055,"line":12091},[1053,15096,7116],{"class":1070},[1053,15098,1191],{"class":1096},[1053,15100,7192],{"class":1260},[1053,15102,1168],{"class":1096},[1053,15104,3879],{"class":1127},[1053,15106,14843],{"class":1485},[1053,15108,3886],{"class":3885},[1053,15110,14355],{"class":1260},[1053,15112,1191],{"class":1096},[1053,15114,14272],{"class":1194},[1053,15116,3907],{"class":3885},[1053,15118,8019],{"class":1485},[1053,15120,3886],{"class":3885},[1053,15122,7204],{"class":1260},[1053,15124,3907],{"class":3885},[1053,15126,5467],{"class":1485},[1053,15128,1269],{"class":1096},[1053,15130,15131,15133],{"class":1055,"line":12110},[1053,15132,8504],{"class":1066},[1053,15134,14657],{"class":1070},[1053,15136,15137],{"class":1055,"line":12126},[1053,15138,1155],{"class":1070},[1053,15140,15141],{"class":1055,"line":12143},[1053,15142,15143],{"class":1059},"    # Step handlers\n",[1053,15145,15146,15148,15151,15153,15155,15157,15159],{"class":1055,"line":12159},[1053,15147,1161],{"class":1127},[1053,15149,15150],{"class":1302}," handle_create_user",[1053,15152,1168],{"class":1096},[1053,15154,1172],{"class":1171},[1053,15156,1097],{"class":1096},[1053,15158,14322],{"class":1177},[1053,15160,1181],{"class":1096},[1053,15162,15163,15165,15168],{"class":1055,"line":12176},[1053,15164,1315],{"class":1141},[1053,15166,15167],{"class":1145},"Handle user creation step",[1053,15169,1149],{"class":1141},[1053,15171,15172,15174,15176,15178,15180],{"class":1055,"line":12192},[1053,15173,8188],{"class":1070},[1053,15175,1521],{"class":1096},[1053,15177,14322],{"class":1070},[1053,15179,1191],{"class":1096},[1053,15181,15182],{"class":1194},"action_data\n",[1053,15184,15185],{"class":1055,"line":12197},[1053,15186,1387],{"class":1070},[1053,15188,15189,15191,15193,15195,15197,15199],{"class":1055,"line":12215},[1053,15190,8402],{"class":1070},[1053,15192,1521],{"class":1096},[1053,15194,6692],{"class":1070},[1053,15196,1191],{"class":1096},[1053,15198,6761],{"class":1260},[1053,15200,5688],{"class":1096},[1053,15202,15203,15205,15207,15209,15211,15213,15215,15217,15219],{"class":1055,"line":12225},[1053,15204,8417],{"class":1127},[1053,15206,5467],{"class":1485},[1053,15208,3886],{"class":3885},[1053,15210,6231],{"class":1260},[1053,15212,1191],{"class":1096},[1053,15214,8428],{"class":6715},[1053,15216,3907],{"class":3885},[1053,15218,9338],{"class":1485},[1053,15220,2402],{"class":1096},[1053,15222,15223,15225,15227,15229],{"class":1055,"line":12231},[1053,15224,8440],{"class":5736},[1053,15226,1521],{"class":1096},[1053,15228,8445],{"class":1260},[1053,15230,2402],{"class":1096},[1053,15232,15233,15235,15237,15239,15241,15243,15245,15247,15249,15251],{"class":1055,"line":12267},[1053,15234,8452],{"class":5736},[1053,15236,8455],{"class":1096},[1053,15238,1489],{"class":1481},[1053,15240,7408],{"class":1485},[1053,15242,1489],{"class":1481},[1053,15244,2393],{"class":1096},[1053,15246,7417],{"class":1260},[1053,15248,1191],{"class":1096},[1053,15250,8470],{"class":6715},[1053,15252,7594],{"class":1096},[1053,15254,15255],{"class":1055,"line":12272},[1053,15256,8477],{"class":1096},[1053,15258,15259],{"class":1055,"line":12290},[1053,15260,1387],{"class":1070},[1053,15262,15263,15265,15267,15269,15271,15273,15275],{"class":1055,"line":12300},[1053,15264,6302],{"class":1066},[1053,15266,7041],{"class":1070},[1053,15268,1191],{"class":1096},[1053,15270,6971],{"class":1194},[1053,15272,8494],{"class":1492},[1053,15274,8497],{"class":3044},[1053,15276,1135],{"class":1096},[1053,15278,15279,15281,15283,15285,15287,15290,15292,15294,15296,15298,15300,15302],{"class":1055,"line":12336},[1053,15280,8504],{"class":1066},[1053,15282,7984],{"class":1265},[1053,15284,1168],{"class":1096},[1053,15286,3879],{"class":1127},[1053,15288,15289],{"class":1485},"\"User creation failed: ",[1053,15291,3886],{"class":3885},[1053,15293,6966],{"class":1260},[1053,15295,1191],{"class":1096},[1053,15297,6971],{"class":1194},[1053,15299,3907],{"class":3885},[1053,15301,5467],{"class":1485},[1053,15303,1269],{"class":1096},[1053,15305,15306],{"class":1055,"line":12341},[1053,15307,1387],{"class":1070},[1053,15309,15310,15312,15314,15316,15318],{"class":1055,"line":12359},[1053,15311,1393],{"class":1066},[1053,15313,7041],{"class":1070},[1053,15315,1191],{"class":1096},[1053,15317,11025],{"class":1260},[1053,15319,1333],{"class":1096},[1053,15321,15322],{"class":1055,"line":12369},[1053,15323,1155],{"class":1070},[1053,15325,15327,15329,15332,15334,15336,15338,15340],{"class":1055,"line":15326},207,[1053,15328,1161],{"class":1127},[1053,15330,15331],{"class":1302}," handle_create_profile",[1053,15333,1168],{"class":1096},[1053,15335,1172],{"class":1171},[1053,15337,1097],{"class":1096},[1053,15339,14322],{"class":1177},[1053,15341,1181],{"class":1096},[1053,15343,15345,15347,15350],{"class":1055,"line":15344},208,[1053,15346,1315],{"class":1141},[1053,15348,15349],{"class":1145},"Handle profile creation step",[1053,15351,1149],{"class":1141},[1053,15353,15355,15358,15360,15362,15364],{"class":1055,"line":15354},209,[1053,15356,15357],{"class":1070},"        profile_data ",[1053,15359,1521],{"class":1096},[1053,15361,14322],{"class":1070},[1053,15363,1191],{"class":1096},[1053,15365,15182],{"class":1194},[1053,15367,15369,15372,15374,15376,15378,15380,15382,15384,15386,15388,15390,15392,15394,15396],{"class":1055,"line":15368},210,[1053,15370,15371],{"class":1070},"        user_id ",[1053,15373,1521],{"class":1096},[1053,15375,14322],{"class":1070},[1053,15377,1191],{"class":1096},[1053,15379,13839],{"class":1194},[1053,15381,1191],{"class":1096},[1053,15383,10107],{"class":1194},[1053,15385,1191],{"class":1096},[1053,15387,4357],{"class":1260},[1053,15389,1168],{"class":1096},[1053,15391,1489],{"class":1481},[1053,15393,8068],{"class":1485},[1053,15395,1489],{"class":1481},[1053,15397,1269],{"class":1096},[1053,15399,15401],{"class":1055,"line":15400},211,[1053,15402,1387],{"class":1070},[1053,15404,15406,15408,15410,15412,15414,15416],{"class":1055,"line":15405},212,[1053,15407,8402],{"class":1070},[1053,15409,1521],{"class":1096},[1053,15411,6692],{"class":1070},[1053,15413,1191],{"class":1096},[1053,15415,6761],{"class":1260},[1053,15417,5688],{"class":1096},[1053,15419,15421,15423,15425,15427,15429,15431,15433,15435,15437,15439,15441,15443,15446],{"class":1055,"line":15420},213,[1053,15422,8417],{"class":1127},[1053,15424,5467],{"class":1485},[1053,15426,3886],{"class":3885},[1053,15428,6231],{"class":1260},[1053,15430,1191],{"class":1096},[1053,15432,8428],{"class":6715},[1053,15434,3907],{"class":3885},[1053,15436,9592],{"class":1485},[1053,15438,3886],{"class":3885},[1053,15440,8068],{"class":1260},[1053,15442,3907],{"class":3885},[1053,15444,15445],{"class":1485},"/profile/\"",[1053,15447,2402],{"class":1096},[1053,15449,15451,15453,15455,15458],{"class":1055,"line":15450},214,[1053,15452,8440],{"class":5736},[1053,15454,1521],{"class":1096},[1053,15456,15457],{"class":1260},"profile_data",[1053,15459,2402],{"class":1096},[1053,15461,15463,15465,15467,15469,15471,15473,15475,15477,15479,15481],{"class":1055,"line":15462},215,[1053,15464,8452],{"class":5736},[1053,15466,8455],{"class":1096},[1053,15468,1489],{"class":1481},[1053,15470,7408],{"class":1485},[1053,15472,1489],{"class":1481},[1053,15474,2393],{"class":1096},[1053,15476,7417],{"class":1260},[1053,15478,1191],{"class":1096},[1053,15480,8470],{"class":6715},[1053,15482,7594],{"class":1096},[1053,15484,15486],{"class":1055,"line":15485},216,[1053,15487,8477],{"class":1096},[1053,15489,15491],{"class":1055,"line":15490},217,[1053,15492,1387],{"class":1070},[1053,15494,15496,15498,15500,15502,15504,15506,15508],{"class":1055,"line":15495},218,[1053,15497,6302],{"class":1066},[1053,15499,7041],{"class":1070},[1053,15501,1191],{"class":1096},[1053,15503,6971],{"class":1194},[1053,15505,8494],{"class":1492},[1053,15507,8497],{"class":3044},[1053,15509,1135],{"class":1096},[1053,15511,15513,15515,15517,15519,15521,15524,15526,15528,15530,15532,15534,15536],{"class":1055,"line":15512},219,[1053,15514,8504],{"class":1066},[1053,15516,7984],{"class":1265},[1053,15518,1168],{"class":1096},[1053,15520,3879],{"class":1127},[1053,15522,15523],{"class":1485},"\"Profile creation failed: ",[1053,15525,3886],{"class":3885},[1053,15527,6966],{"class":1260},[1053,15529,1191],{"class":1096},[1053,15531,6971],{"class":1194},[1053,15533,3907],{"class":3885},[1053,15535,5467],{"class":1485},[1053,15537,1269],{"class":1096},[1053,15539,15541],{"class":1055,"line":15540},220,[1053,15542,1387],{"class":1070},[1053,15544,15546,15548,15550,15552,15554],{"class":1055,"line":15545},221,[1053,15547,1393],{"class":1066},[1053,15549,7041],{"class":1070},[1053,15551,1191],{"class":1096},[1053,15553,11025],{"class":1260},[1053,15555,1333],{"class":1096},[1053,15557,15559],{"class":1055,"line":15558},222,[1053,15560,1155],{"class":1070},[1053,15562,15564,15566,15569,15571,15573,15575,15577],{"class":1055,"line":15563},223,[1053,15565,1161],{"class":1127},[1053,15567,15568],{"class":1302}," handle_send_welcome_email",[1053,15570,1168],{"class":1096},[1053,15572,1172],{"class":1171},[1053,15574,1097],{"class":1096},[1053,15576,14322],{"class":1177},[1053,15578,1181],{"class":1096},[1053,15580,15582,15584,15587],{"class":1055,"line":15581},224,[1053,15583,1315],{"class":1141},[1053,15585,15586],{"class":1145},"Handle welcome email step",[1053,15588,1149],{"class":1141},[1053,15590,15592,15595,15597,15599,15601],{"class":1055,"line":15591},225,[1053,15593,15594],{"class":1070},"        email_data ",[1053,15596,1521],{"class":1096},[1053,15598,14322],{"class":1070},[1053,15600,1191],{"class":1096},[1053,15602,15182],{"class":1194},[1053,15604,15606],{"class":1055,"line":15605},226,[1053,15607,1387],{"class":1070},[1053,15609,15611,15613,15615,15617,15619,15621],{"class":1055,"line":15610},227,[1053,15612,8402],{"class":1070},[1053,15614,1521],{"class":1096},[1053,15616,6692],{"class":1070},[1053,15618,1191],{"class":1096},[1053,15620,6761],{"class":1260},[1053,15622,5688],{"class":1096},[1053,15624,15626,15628,15630,15632,15634,15636,15639,15641,15644],{"class":1055,"line":15625},228,[1053,15627,8417],{"class":1127},[1053,15629,5467],{"class":1485},[1053,15631,3886],{"class":3885},[1053,15633,6231],{"class":1260},[1053,15635,1191],{"class":1096},[1053,15637,15638],{"class":6715},"NOTIFICATION_SERVICE_URL",[1053,15640,3907],{"class":3885},[1053,15642,15643],{"class":1485},"/api/v1/emails/\"",[1053,15645,2402],{"class":1096},[1053,15647,15649,15651,15653,15656],{"class":1055,"line":15648},229,[1053,15650,8440],{"class":5736},[1053,15652,1521],{"class":1096},[1053,15654,15655],{"class":1260},"email_data",[1053,15657,2402],{"class":1096},[1053,15659,15661,15663,15665,15667,15669,15671,15673,15675,15677,15679],{"class":1055,"line":15660},230,[1053,15662,8452],{"class":5736},[1053,15664,8455],{"class":1096},[1053,15666,1489],{"class":1481},[1053,15668,7408],{"class":1485},[1053,15670,1489],{"class":1481},[1053,15672,2393],{"class":1096},[1053,15674,7417],{"class":1260},[1053,15676,1191],{"class":1096},[1053,15678,8470],{"class":6715},[1053,15680,7594],{"class":1096},[1053,15682,15684],{"class":1055,"line":15683},231,[1053,15685,8477],{"class":1096},[1053,15687,15689],{"class":1055,"line":15688},232,[1053,15690,1387],{"class":1070},[1053,15692,15694,15696,15698,15700,15702,15704,15707],{"class":1055,"line":15693},233,[1053,15695,6302],{"class":1066},[1053,15697,7041],{"class":1070},[1053,15699,1191],{"class":1096},[1053,15701,6971],{"class":1194},[1053,15703,8494],{"class":1492},[1053,15705,15706],{"class":3044}," 202",[1053,15708,1135],{"class":1096},[1053,15710,15712,15714,15716,15718,15720,15723,15725,15727,15729,15731,15733,15735],{"class":1055,"line":15711},234,[1053,15713,8504],{"class":1066},[1053,15715,7984],{"class":1265},[1053,15717,1168],{"class":1096},[1053,15719,3879],{"class":1127},[1053,15721,15722],{"class":1485},"\"Email sending failed: ",[1053,15724,3886],{"class":3885},[1053,15726,6966],{"class":1260},[1053,15728,1191],{"class":1096},[1053,15730,6971],{"class":1194},[1053,15732,3907],{"class":3885},[1053,15734,5467],{"class":1485},[1053,15736,1269],{"class":1096},[1053,15738,15740],{"class":1055,"line":15739},235,[1053,15741,1387],{"class":1070},[1053,15743,15745,15747,15749,15751,15753],{"class":1055,"line":15744},236,[1053,15746,1393],{"class":1066},[1053,15748,7041],{"class":1070},[1053,15750,1191],{"class":1096},[1053,15752,11025],{"class":1260},[1053,15754,1333],{"class":1096},[1053,15756,15758],{"class":1055,"line":15757},237,[1053,15759,1155],{"class":1070},[1053,15761,15763],{"class":1055,"line":15762},238,[1053,15764,15765],{"class":1059},"    # Compensation handlers\n",[1053,15767,15769,15771,15774,15776,15778,15780,15782],{"class":1055,"line":15768},239,[1053,15770,1161],{"class":1127},[1053,15772,15773],{"class":1302}," compensate_create_user",[1053,15775,1168],{"class":1096},[1053,15777,1172],{"class":1171},[1053,15779,1097],{"class":1096},[1053,15781,14322],{"class":1177},[1053,15783,1181],{"class":1096},[1053,15785,15787,15789,15792],{"class":1055,"line":15786},240,[1053,15788,1315],{"class":1141},[1053,15790,15791],{"class":1145},"Compensate user creation",[1053,15793,1149],{"class":1141},[1053,15795,15797,15799,15801,15803,15805,15807,15809,15811,15813,15815,15817,15819],{"class":1055,"line":15796},241,[1053,15798,15371],{"class":1070},[1053,15800,1521],{"class":1096},[1053,15802,14322],{"class":1070},[1053,15804,1191],{"class":1096},[1053,15806,14455],{"class":1194},[1053,15808,1191],{"class":1096},[1053,15810,4357],{"class":1260},[1053,15812,1168],{"class":1096},[1053,15814,1489],{"class":1481},[1053,15816,2667],{"class":1485},[1053,15818,1489],{"class":1481},[1053,15820,1269],{"class":1096},[1053,15822,15824,15826,15828],{"class":1055,"line":15823},242,[1053,15825,6302],{"class":1066},[1053,15827,8873],{"class":1070},[1053,15829,1135],{"class":1096},[1053,15831,15833,15836,15838,15840],{"class":1055,"line":15832},243,[1053,15834,15835],{"class":1070},"            requests",[1053,15837,1191],{"class":1096},[1053,15839,6882],{"class":1260},[1053,15841,5688],{"class":1096},[1053,15843,15845,15848,15850,15852,15854,15856,15858,15860,15862,15864,15866,15868,15870],{"class":1055,"line":15844},244,[1053,15846,15847],{"class":1127},"                f",[1053,15849,5467],{"class":1485},[1053,15851,3886],{"class":3885},[1053,15853,6231],{"class":1260},[1053,15855,1191],{"class":1096},[1053,15857,8428],{"class":6715},[1053,15859,3907],{"class":3885},[1053,15861,9592],{"class":1485},[1053,15863,3886],{"class":3885},[1053,15865,8068],{"class":1260},[1053,15867,3907],{"class":3885},[1053,15869,9601],{"class":1485},[1053,15871,2402],{"class":1096},[1053,15873,15875,15877,15879,15881,15883,15885,15887,15889,15891,15893],{"class":1055,"line":15874},245,[1053,15876,7376],{"class":5736},[1053,15878,8455],{"class":1096},[1053,15880,1489],{"class":1481},[1053,15882,7408],{"class":1485},[1053,15884,1489],{"class":1481},[1053,15886,2393],{"class":1096},[1053,15888,7417],{"class":1260},[1053,15890,1191],{"class":1096},[1053,15892,8470],{"class":6715},[1053,15894,7594],{"class":1096},[1053,15896,15898],{"class":1055,"line":15897},246,[1053,15899,7015],{"class":1096},[1053,15901,15903],{"class":1055,"line":15902},247,[1053,15904,1155],{"class":1070},[1053,15906,15908,15910,15913,15915,15917,15919,15921],{"class":1055,"line":15907},248,[1053,15909,1161],{"class":1127},[1053,15911,15912],{"class":1302}," compensate_create_profile",[1053,15914,1168],{"class":1096},[1053,15916,1172],{"class":1171},[1053,15918,1097],{"class":1096},[1053,15920,14322],{"class":1177},[1053,15922,1181],{"class":1096},[1053,15924,15926,15928,15931],{"class":1055,"line":15925},249,[1053,15927,1315],{"class":1141},[1053,15929,15930],{"class":1145},"Compensate profile creation",[1053,15932,1149],{"class":1141},[1053,15934,15936,15938,15940,15942,15944,15946,15948,15950,15952,15954,15956,15958,15960,15962],{"class":1055,"line":15935},250,[1053,15937,15371],{"class":1070},[1053,15939,1521],{"class":1096},[1053,15941,14322],{"class":1070},[1053,15943,1191],{"class":1096},[1053,15945,13839],{"class":1194},[1053,15947,1191],{"class":1096},[1053,15949,10107],{"class":1194},[1053,15951,1191],{"class":1096},[1053,15953,4357],{"class":1260},[1053,15955,1168],{"class":1096},[1053,15957,1489],{"class":1481},[1053,15959,8068],{"class":1485},[1053,15961,1489],{"class":1481},[1053,15963,1269],{"class":1096},[1053,15965,15967,15969,15971],{"class":1055,"line":15966},251,[1053,15968,6302],{"class":1066},[1053,15970,8873],{"class":1070},[1053,15972,1135],{"class":1096},[1053,15974,15976,15978,15980,15982],{"class":1055,"line":15975},252,[1053,15977,15835],{"class":1070},[1053,15979,1191],{"class":1096},[1053,15981,6882],{"class":1260},[1053,15983,5688],{"class":1096},[1053,15985,15987,15989,15991,15993,15995,15997,15999,16001,16003,16005,16007,16009,16011],{"class":1055,"line":15986},253,[1053,15988,15847],{"class":1127},[1053,15990,5467],{"class":1485},[1053,15992,3886],{"class":3885},[1053,15994,6231],{"class":1260},[1053,15996,1191],{"class":1096},[1053,15998,8428],{"class":6715},[1053,16000,3907],{"class":3885},[1053,16002,9592],{"class":1485},[1053,16004,3886],{"class":3885},[1053,16006,8068],{"class":1260},[1053,16008,3907],{"class":3885},[1053,16010,15445],{"class":1485},[1053,16012,2402],{"class":1096},[1053,16014,16016,16018,16020,16022,16024,16026,16028,16030,16032,16034],{"class":1055,"line":16015},254,[1053,16017,7376],{"class":5736},[1053,16019,8455],{"class":1096},[1053,16021,1489],{"class":1481},[1053,16023,7408],{"class":1485},[1053,16025,1489],{"class":1481},[1053,16027,2393],{"class":1096},[1053,16029,7417],{"class":1260},[1053,16031,1191],{"class":1096},[1053,16033,8470],{"class":6715},[1053,16035,7594],{"class":1096},[1053,16037,16039],{"class":1055,"line":16038},255,[1053,16040,7015],{"class":1096},[1053,16042,16044],{"class":1055,"line":16043},256,[1053,16045,1155],{"class":1070},[1053,16047,16049,16051,16054,16056,16058,16060,16062],{"class":1055,"line":16048},257,[1053,16050,1161],{"class":1127},[1053,16052,16053],{"class":1302}," compensate_send_welcome_email",[1053,16055,1168],{"class":1096},[1053,16057,1172],{"class":1171},[1053,16059,1097],{"class":1096},[1053,16061,14322],{"class":1177},[1053,16063,1181],{"class":1096},[1053,16065,16067,16069,16072],{"class":1055,"line":16066},258,[1053,16068,1315],{"class":1141},[1053,16070,16071],{"class":1145},"Compensate welcome email (no-op)",[1053,16073,1149],{"class":1141},[1053,16075,16077],{"class":1055,"line":16076},259,[1053,16078,16079],{"class":1059},"        # Email can't be unsent, but we could send a cancellation email\n",[1053,16081,16083],{"class":1055,"line":16082},260,[1053,16084,16085],{"class":1066},"        pass\n",[1053,16087,16089],{"class":1055,"line":16088},261,[1053,16090,1121],{"emptyLinePlaceholder":1120},[1053,16092,16094],{"class":1055,"line":16093},262,[1053,16095,16096],{"class":1059},"# Usage example\n",[1053,16098,16100,16102,16105,16107,16109,16111,16114],{"class":1055,"line":16099},263,[1053,16101,9276],{"class":1127},[1053,16103,16104],{"class":1302}," create_user_with_profile_saga",[1053,16106,1168],{"class":1096},[1053,16108,8445],{"class":1177},[1053,16110,1097],{"class":1096},[1053,16112,16113],{"class":1177}," profile_data",[1053,16115,1181],{"class":1096},[1053,16117,16119,16121,16124],{"class":1055,"line":16118},264,[1053,16120,1142],{"class":1141},[1053,16122,16123],{"class":1145},"Create user with profile using saga pattern",[1053,16125,1149],{"class":1141},[1053,16127,16129,16132,16134,16136],{"class":1055,"line":16128},265,[1053,16130,16131],{"class":1070},"    orchestrator ",[1053,16133,1521],{"class":1096},[1053,16135,13383],{"class":1260},[1053,16137,1333],{"class":1096},[1053,16139,16141],{"class":1055,"line":16140},266,[1053,16142,1155],{"class":1070},[1053,16144,16146,16149,16151],{"class":1055,"line":16145},267,[1053,16147,16148],{"class":1070},"    steps ",[1053,16150,1521],{"class":1096},[1053,16152,16153],{"class":1096}," [\n",[1053,16155,16157],{"class":1055,"line":16156},268,[1053,16158,16159],{"class":1096},"        {\n",[1053,16161,16163,16165,16167,16169,16171,16173,16175,16177],{"class":1055,"line":16162},269,[1053,16164,3542],{"class":1481},[1053,16166,2388],{"class":1485},[1053,16168,1489],{"class":1481},[1053,16170,2393],{"class":1096},[1053,16172,1482],{"class":1481},[1053,16174,9089],{"class":1485},[1053,16176,1489],{"class":1481},[1053,16178,2402],{"class":1096},[1053,16180,16182,16184,16186,16188,16190,16192,16194,16196],{"class":1055,"line":16181},270,[1053,16183,3542],{"class":1481},[1053,16185,10064],{"class":1485},[1053,16187,1489],{"class":1481},[1053,16189,2393],{"class":1096},[1053,16191,1482],{"class":1481},[1053,16193,11460],{"class":1485},[1053,16195,1489],{"class":1481},[1053,16197,2402],{"class":1096},[1053,16199,16201,16203,16205,16207,16209],{"class":1055,"line":16200},271,[1053,16202,3542],{"class":1481},[1053,16204,10107],{"class":1485},[1053,16206,1489],{"class":1481},[1053,16208,2393],{"class":1096},[1053,16210,10114],{"class":1070},[1053,16212,16214],{"class":1055,"line":16213},272,[1053,16215,16216],{"class":1096},"        },\n",[1053,16218,16220],{"class":1055,"line":16219},273,[1053,16221,16159],{"class":1096},[1053,16223,16225,16227,16229,16231,16233,16235,16237,16239],{"class":1055,"line":16224},274,[1053,16226,3542],{"class":1481},[1053,16228,2388],{"class":1485},[1053,16230,1489],{"class":1481},[1053,16232,2393],{"class":1096},[1053,16234,1482],{"class":1481},[1053,16236,13449],{"class":1485},[1053,16238,1489],{"class":1481},[1053,16240,2402],{"class":1096},[1053,16242,16244,16246,16248,16250,16252,16254,16256,16258],{"class":1055,"line":16243},275,[1053,16245,3542],{"class":1481},[1053,16247,10064],{"class":1485},[1053,16249,1489],{"class":1481},[1053,16251,2393],{"class":1096},[1053,16253,1482],{"class":1481},[1053,16255,11460],{"class":1485},[1053,16257,1489],{"class":1481},[1053,16259,2402],{"class":1096},[1053,16261,16263,16265,16267,16269,16271],{"class":1055,"line":16262},276,[1053,16264,3542],{"class":1481},[1053,16266,10107],{"class":1485},[1053,16268,1489],{"class":1481},[1053,16270,2393],{"class":1096},[1053,16272,16273],{"class":1070}," profile_data\n",[1053,16275,16277],{"class":1055,"line":16276},277,[1053,16278,16216],{"class":1096},[1053,16280,16282],{"class":1055,"line":16281},278,[1053,16283,16159],{"class":1096},[1053,16285,16287,16289,16291,16293,16295,16297,16299,16301],{"class":1055,"line":16286},279,[1053,16288,3542],{"class":1481},[1053,16290,2388],{"class":1485},[1053,16292,1489],{"class":1481},[1053,16294,2393],{"class":1096},[1053,16296,1482],{"class":1481},[1053,16298,13469],{"class":1485},[1053,16300,1489],{"class":1481},[1053,16302,2402],{"class":1096},[1053,16304,16306,16308,16310,16312,16314,16316,16319,16321],{"class":1055,"line":16305},280,[1053,16307,3542],{"class":1481},[1053,16309,10064],{"class":1485},[1053,16311,1489],{"class":1481},[1053,16313,2393],{"class":1096},[1053,16315,1482],{"class":1481},[1053,16317,16318],{"class":1485},"notification-service",[1053,16320,1489],{"class":1481},[1053,16322,2402],{"class":1096},[1053,16324,16326,16328,16330,16332,16334],{"class":1055,"line":16325},281,[1053,16327,3542],{"class":1481},[1053,16329,10107],{"class":1485},[1053,16331,1489],{"class":1481},[1053,16333,2393],{"class":1096},[1053,16335,3536],{"class":1096},[1053,16337,16339,16341,16344,16346,16348,16350,16352,16354,16356,16358],{"class":1055,"line":16338},282,[1053,16340,5594],{"class":1481},[1053,16342,16343],{"class":1485},"to",[1053,16345,1489],{"class":1481},[1053,16347,2393],{"class":1096},[1053,16349,8704],{"class":1070},[1053,16351,1723],{"class":1096},[1053,16353,1489],{"class":1481},[1053,16355,8236],{"class":1485},[1053,16357,1489],{"class":1481},[1053,16359,13862],{"class":1096},[1053,16361,16363,16365,16368,16370,16372,16374,16377,16379],{"class":1055,"line":16362},283,[1053,16364,5594],{"class":1481},[1053,16366,16367],{"class":1485},"template",[1053,16369,1489],{"class":1481},[1053,16371,2393],{"class":1096},[1053,16373,1482],{"class":1481},[1053,16375,16376],{"class":1485},"welcome",[1053,16378,1489],{"class":1481},[1053,16380,2402],{"class":1096},[1053,16382,16384,16386,16388,16390,16392,16394,16396,16398,16400,16402,16404,16406,16408,16410,16412],{"class":1055,"line":16383},284,[1053,16385,5594],{"class":1481},[1053,16387,10107],{"class":1485},[1053,16389,1489],{"class":1481},[1053,16391,2393],{"class":1096},[1053,16393,7141],{"class":1096},[1053,16395,1489],{"class":1481},[1053,16397,8217],{"class":1485},[1053,16399,1489],{"class":1481},[1053,16401,2393],{"class":1096},[1053,16403,8704],{"class":1070},[1053,16405,1723],{"class":1096},[1053,16407,1489],{"class":1481},[1053,16409,8217],{"class":1485},[1053,16411,1489],{"class":1481},[1053,16413,16414],{"class":1096},"]}\n",[1053,16416,16418],{"class":1055,"line":16417},285,[1053,16419,3812],{"class":1096},[1053,16421,16423],{"class":1055,"line":16422},286,[1053,16424,3818],{"class":1096},[1053,16426,16428],{"class":1055,"line":16427},287,[1053,16429,16430],{"class":1096},"    ]\n",[1053,16432,16434],{"class":1055,"line":16433},288,[1053,16435,1155],{"class":1070},[1053,16437,16439,16441,16443,16446,16448,16451,16453,16455,16458,16460,16462,16464,16466,16468],{"class":1055,"line":16438},289,[1053,16440,13038],{"class":1070},[1053,16442,1521],{"class":1096},[1053,16444,16445],{"class":1070}," orchestrator",[1053,16447,1191],{"class":1096},[1053,16449,16450],{"class":1260},"start_saga",[1053,16452,1168],{"class":1096},[1053,16454,1489],{"class":1481},[1053,16456,16457],{"class":1485},"user_registration",[1053,16459,1489],{"class":1481},[1053,16461,1097],{"class":1096},[1053,16463,8704],{"class":1260},[1053,16465,1097],{"class":1096},[1053,16467,13711],{"class":1260},[1053,16469,1269],{"class":1096},[1053,16471,16473,16476],{"class":1055,"line":16472},290,[1053,16474,16475],{"class":1066},"    return",[1053,16477,13984],{"class":1070},[1030,16479,16481],{"id":16480},"monitoring-migration-progress","Monitoring Migration Progress",[1035,16483,16485],{"id":16484},"_1-migration-metrics","1. Migration Metrics",[1043,16487,16489],{"className":1045,"code":16488,"language":1047,"meta":1048,"style":1048},"# migration_metrics.py\nfrom prometheus_client import Counter, Gauge, Histogram\nimport time\n\n# Migration metrics\nMIGRATION_REQUESTS = Counter(\n    'migration_requests_total',\n    'Total migration requests',\n    ['source', 'target', 'status']\n)\n\nDUAL_WRITE_OPERATIONS = Counter(\n    'dual_write_operations_total',\n    'Total dual write operations',\n    ['operation', 'status']\n)\n\nSAGA_EXECUTIONS = Counter(\n    'saga_executions_total',\n    'Total saga executions',\n    ['saga_type', 'status']\n)\n\nMIGRATION_PROGRESS = Gauge(\n    'migration_progress_percent',\n    'Migration progress percentage',\n    ['service']\n)\n\nclass MigrationMetricsCollector:\n    \"\"\"Collect migration-specific metrics\"\"\"\n    \n    @staticmethod\n    def record_migration_request(source, target, success=True):\n        \"\"\"Record migration request\"\"\"\n        status = 'success' if success else 'failure'\n        MIGRATION_REQUESTS.labels(\n            source=source,\n            target=target,\n            status=status\n        ).inc()\n    \n    @staticmethod\n    def record_dual_write(operation, success=True):\n        \"\"\"Record dual write operation\"\"\"\n        status = 'success' if success else 'failure'\n        DUAL_WRITE_OPERATIONS.labels(\n            operation=operation,\n            status=status\n        ).inc()\n    \n    @staticmethod\n    def record_saga_execution(saga_type, success=True):\n        \"\"\"Record saga execution\"\"\"\n        status = 'success' if success else 'failure'\n        SAGA_EXECUTIONS.labels(\n            saga_type=saga_type,\n            status=status\n        ).inc()\n    \n    @staticmethod\n    def update_migration_progress(service, percentage):\n        \"\"\"Update migration progress\"\"\"\n        MIGRATION_PROGRESS.labels(service=service).set(percentage)\n\nclass MigrationDashboard:\n    \"\"\"Generate migration progress dashboard\"\"\"\n    \n    def __init__(self):\n        self.metrics = MigrationMetricsCollector()\n    \n    def get_migration_status(self):\n        \"\"\"Get overall migration status\"\"\"\n        return {\n            'user_service': self._get_user_service_progress(),\n            'product_service': self._get_product_service_progress(),\n            'order_service': self._get_order_service_progress(),\n            'overall_progress': self._calculate_overall_progress()\n        }\n    \n    def _get_user_service_progress(self):\n        \"\"\"Get user service migration progress\"\"\"\n        total_users = User.objects.count()\n        migrated_users = self._count_migrated_users()\n        \n        progress = (migrated_users / total_users * 100) if total_users > 0 else 0\n        self.metrics.update_migration_progress('user-service', progress)\n        \n        return {\n            'total_records': total_users,\n            'migrated_records': migrated_users,\n            'progress_percent': progress,\n            'status': 'in_progress' if progress \u003C 100 else 'completed'\n        }\n    \n    def _count_migrated_users(self):\n        \"\"\"Count users that have been migrated\"\"\"\n        # This would check migration status in your tracking system\n        # For example, checking if user exists in microservice\n        migrated_count = 0\n        \n        try:\n            response = requests.get(\n                f\"{settings.USER_SERVICE_URL}/api/v1/users/count/\",\n                headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n            )\n            \n            if response.status_code == 200:\n                migrated_count = response.json().get('count', 0)\n        except:\n            pass\n        \n        return migrated_count\n    \n    def _calculate_overall_progress(self):\n        \"\"\"Calculate overall migration progress\"\"\"\n        # This would aggregate progress from all services\n        return 45.5  # Example percentage\n",[1050,16490,16491,16496,16518,16525,16529,16534,16545,16556,16567,16597,16601,16605,16616,16627,16638,16659,16663,16667,16678,16689,16700,16720,16724,16728,16739,16750,16761,16773,16777,16781,16790,16799,16803,16811,16838,16847,16874,16886,16897,16908,16917,16926,16930,16936,16957,16966,16990,17001,17012,17020,17028,17032,17038,17059,17068,17092,17103,17114,17122,17130,17134,17140,17158,17167,17194,17198,17207,17216,17220,17232,17247,17251,17264,17273,17279,17298,17317,17336,17356,17360,17364,17377,17386,17404,17420,17424,17460,17488,17492,17498,17513,17529,17544,17579,17583,17587,17600,17609,17614,17619,17628,17632,17638,17653,17674,17696,17700,17704,17720,17751,17757,17761,17765,17772,17776,17789,17798,17803],{"__ignoreMap":1048},[1053,16492,16493],{"class":1055,"line":1056},[1053,16494,16495],{"class":1059},"# migration_metrics.py\n",[1053,16497,16498,16500,16503,16505,16508,16510,16513,16515],{"class":1055,"line":1063},[1053,16499,1085],{"class":1066},[1053,16501,16502],{"class":1070}," prometheus_client ",[1053,16504,1067],{"class":1066},[1053,16506,16507],{"class":1070}," Counter",[1053,16509,1097],{"class":1096},[1053,16511,16512],{"class":1070}," Gauge",[1053,16514,1097],{"class":1096},[1053,16516,16517],{"class":1070}," Histogram\n",[1053,16519,16520,16522],{"class":1055,"line":1074},[1053,16521,1067],{"class":1066},[1053,16523,16524],{"class":1070}," time\n",[1053,16526,16527],{"class":1055,"line":1082},[1053,16528,1121],{"emptyLinePlaceholder":1120},[1053,16530,16531],{"class":1055,"line":1103},[1053,16532,16533],{"class":1059},"# Migration metrics\n",[1053,16535,16536,16539,16541,16543],{"class":1055,"line":1117},[1053,16537,16538],{"class":1187},"MIGRATION_REQUESTS",[1053,16540,1198],{"class":1096},[1053,16542,16507],{"class":1260},[1053,16544,5688],{"class":1096},[1053,16546,16547,16549,16552,16554],{"class":1055,"line":1124},[1053,16548,7486],{"class":1481},[1053,16550,16551],{"class":1485},"migration_requests_total",[1053,16553,1489],{"class":1481},[1053,16555,2402],{"class":1096},[1053,16557,16558,16560,16563,16565],{"class":1055,"line":1138},[1053,16559,7486],{"class":1481},[1053,16561,16562],{"class":1485},"Total migration requests",[1053,16564,1489],{"class":1481},[1053,16566,2402],{"class":1096},[1053,16568,16569,16572,16574,16577,16579,16581,16583,16585,16587,16589,16591,16593,16595],{"class":1055,"line":1152},[1053,16570,16571],{"class":1096},"    [",[1053,16573,1489],{"class":1481},[1053,16575,16576],{"class":1485},"source",[1053,16578,1489],{"class":1481},[1053,16580,1097],{"class":1096},[1053,16582,1482],{"class":1481},[1053,16584,2637],{"class":1485},[1053,16586,1489],{"class":1481},[1053,16588,1097],{"class":1096},[1053,16590,1482],{"class":1481},[1053,16592,14059],{"class":1485},[1053,16594,1489],{"class":1481},[1053,16596,4973],{"class":1096},[1053,16598,16599],{"class":1055,"line":1158},[1053,16600,1269],{"class":1096},[1053,16602,16603],{"class":1055,"line":1184},[1053,16604,1121],{"emptyLinePlaceholder":1120},[1053,16606,16607,16610,16612,16614],{"class":1055,"line":1204},[1053,16608,16609],{"class":1187},"DUAL_WRITE_OPERATIONS",[1053,16611,1198],{"class":1096},[1053,16613,16507],{"class":1260},[1053,16615,5688],{"class":1096},[1053,16617,16618,16620,16623,16625],{"class":1055,"line":1219},[1053,16619,7486],{"class":1481},[1053,16621,16622],{"class":1485},"dual_write_operations_total",[1053,16624,1489],{"class":1481},[1053,16626,2402],{"class":1096},[1053,16628,16629,16631,16634,16636],{"class":1055,"line":1234},[1053,16630,7486],{"class":1481},[1053,16632,16633],{"class":1485},"Total dual write operations",[1053,16635,1489],{"class":1481},[1053,16637,2402],{"class":1096},[1053,16639,16640,16642,16644,16647,16649,16651,16653,16655,16657],{"class":1055,"line":1248},[1053,16641,16571],{"class":1096},[1053,16643,1489],{"class":1481},[1053,16645,16646],{"class":1485},"operation",[1053,16648,1489],{"class":1481},[1053,16650,1097],{"class":1096},[1053,16652,1482],{"class":1481},[1053,16654,14059],{"class":1485},[1053,16656,1489],{"class":1481},[1053,16658,4973],{"class":1096},[1053,16660,16661],{"class":1055,"line":1272},[1053,16662,1269],{"class":1096},[1053,16664,16665],{"class":1055,"line":1292},[1053,16666,1121],{"emptyLinePlaceholder":1120},[1053,16668,16669,16672,16674,16676],{"class":1055,"line":1297},[1053,16670,16671],{"class":1187},"SAGA_EXECUTIONS",[1053,16673,1198],{"class":1096},[1053,16675,16507],{"class":1260},[1053,16677,5688],{"class":1096},[1053,16679,16680,16682,16685,16687],{"class":1055,"line":1312},[1053,16681,7486],{"class":1481},[1053,16683,16684],{"class":1485},"saga_executions_total",[1053,16686,1489],{"class":1481},[1053,16688,2402],{"class":1096},[1053,16690,16691,16693,16696,16698],{"class":1055,"line":1323},[1053,16692,7486],{"class":1481},[1053,16694,16695],{"class":1485},"Total saga executions",[1053,16697,1489],{"class":1481},[1053,16699,2402],{"class":1096},[1053,16701,16702,16704,16706,16708,16710,16712,16714,16716,16718],{"class":1055,"line":1336},[1053,16703,16571],{"class":1096},[1053,16705,1489],{"class":1481},[1053,16707,13766],{"class":1485},[1053,16709,1489],{"class":1481},[1053,16711,1097],{"class":1096},[1053,16713,1482],{"class":1481},[1053,16715,14059],{"class":1485},[1053,16717,1489],{"class":1481},[1053,16719,4973],{"class":1096},[1053,16721,16722],{"class":1055,"line":1348},[1053,16723,1269],{"class":1096},[1053,16725,16726],{"class":1055,"line":1360},[1053,16727,1121],{"emptyLinePlaceholder":1120},[1053,16729,16730,16733,16735,16737],{"class":1055,"line":1372},[1053,16731,16732],{"class":1187},"MIGRATION_PROGRESS",[1053,16734,1198],{"class":1096},[1053,16736,16512],{"class":1260},[1053,16738,5688],{"class":1096},[1053,16740,16741,16743,16746,16748],{"class":1055,"line":1384},[1053,16742,7486],{"class":1481},[1053,16744,16745],{"class":1485},"migration_progress_percent",[1053,16747,1489],{"class":1481},[1053,16749,2402],{"class":1096},[1053,16751,16752,16754,16757,16759],{"class":1055,"line":1390},[1053,16753,7486],{"class":1481},[1053,16755,16756],{"class":1485},"Migration progress percentage",[1053,16758,1489],{"class":1481},[1053,16760,2402],{"class":1096},[1053,16762,16763,16765,16767,16769,16771],{"class":1055,"line":1406},[1053,16764,16571],{"class":1096},[1053,16766,1489],{"class":1481},[1053,16768,10064],{"class":1485},[1053,16770,1489],{"class":1481},[1053,16772,4973],{"class":1096},[1053,16774,16775],{"class":1055,"line":1411},[1053,16776,1269],{"class":1096},[1053,16778,16779],{"class":1055,"line":1425},[1053,16780,1121],{"emptyLinePlaceholder":1120},[1053,16782,16783,16785,16788],{"class":1055,"line":1435},[1053,16784,1128],{"class":1127},[1053,16786,16787],{"class":1131}," MigrationMetricsCollector",[1053,16789,1135],{"class":1096},[1053,16791,16792,16794,16797],{"class":1055,"line":1475},[1053,16793,1142],{"class":1141},[1053,16795,16796],{"class":1145},"Collect migration-specific metrics",[1053,16798,1149],{"class":1141},[1053,16800,16801],{"class":1055,"line":1515},[1053,16802,1155],{"class":1070},[1053,16804,16805,16808],{"class":1055,"line":1543},[1053,16806,16807],{"class":1096},"    @",[1053,16809,16810],{"class":1265},"staticmethod\n",[1053,16812,16813,16815,16818,16820,16822,16824,16827,16829,16832,16834,16836],{"class":1055,"line":1579},[1053,16814,1161],{"class":1127},[1053,16816,16817],{"class":1302}," record_migration_request",[1053,16819,1168],{"class":1096},[1053,16821,16576],{"class":1177},[1053,16823,1097],{"class":1096},[1053,16825,16826],{"class":1177}," target",[1053,16828,1097],{"class":1096},[1053,16830,16831],{"class":1177}," success",[1053,16833,1521],{"class":1492},[1053,16835,5769],{"class":5768},[1053,16837,1181],{"class":1096},[1053,16839,16840,16842,16845],{"class":1055,"line":1601},[1053,16841,1315],{"class":1141},[1053,16843,16844],{"class":1145},"Record migration request",[1053,16846,1149],{"class":1141},[1053,16848,16849,16852,16854,16856,16858,16860,16862,16865,16867,16869,16872],{"class":1055,"line":1606},[1053,16850,16851],{"class":1070},"        status ",[1053,16853,1521],{"class":1096},[1053,16855,1482],{"class":1481},[1053,16857,8560],{"class":1485},[1053,16859,1489],{"class":1481},[1053,16861,2467],{"class":1066},[1053,16863,16864],{"class":1070}," success ",[1053,16866,10427],{"class":1066},[1053,16868,1482],{"class":1481},[1053,16870,16871],{"class":1485},"failure",[1053,16873,10435],{"class":1481},[1053,16875,16876,16879,16881,16884],{"class":1055,"line":1620},[1053,16877,16878],{"class":1187},"        MIGRATION_REQUESTS",[1053,16880,1191],{"class":1096},[1053,16882,16883],{"class":1260},"labels",[1053,16885,5688],{"class":1096},[1053,16887,16888,16891,16893,16895],{"class":1055,"line":1630},[1053,16889,16890],{"class":5736},"            source",[1053,16892,1521],{"class":1096},[1053,16894,16576],{"class":1260},[1053,16896,2402],{"class":1096},[1053,16898,16899,16902,16904,16906],{"class":1055,"line":1648},[1053,16900,16901],{"class":5736},"            target",[1053,16903,1521],{"class":1096},[1053,16905,2637],{"class":1260},[1053,16907,2402],{"class":1096},[1053,16909,16910,16912,16914],{"class":1055,"line":1690},[1053,16911,14748],{"class":5736},[1053,16913,1521],{"class":1096},[1053,16915,16916],{"class":1260},"status\n",[1053,16918,16919,16921,16924],{"class":1055,"line":1713},[1053,16920,14761],{"class":1096},[1053,16922,16923],{"class":1260},"inc",[1053,16925,1333],{"class":1096},[1053,16927,16928],{"class":1055,"line":1747},[1053,16929,1155],{"class":1070},[1053,16931,16932,16934],{"class":1055,"line":1752},[1053,16933,16807],{"class":1096},[1053,16935,16810],{"class":1265},[1053,16937,16938,16940,16943,16945,16947,16949,16951,16953,16955],{"class":1055,"line":1766},[1053,16939,1161],{"class":1127},[1053,16941,16942],{"class":1302}," record_dual_write",[1053,16944,1168],{"class":1096},[1053,16946,16646],{"class":1177},[1053,16948,1097],{"class":1096},[1053,16950,16831],{"class":1177},[1053,16952,1521],{"class":1492},[1053,16954,5769],{"class":5768},[1053,16956,1181],{"class":1096},[1053,16958,16959,16961,16964],{"class":1055,"line":1776},[1053,16960,1315],{"class":1141},[1053,16962,16963],{"class":1145},"Record dual write operation",[1053,16965,1149],{"class":1141},[1053,16967,16968,16970,16972,16974,16976,16978,16980,16982,16984,16986,16988],{"class":1055,"line":1793},[1053,16969,16851],{"class":1070},[1053,16971,1521],{"class":1096},[1053,16973,1482],{"class":1481},[1053,16975,8560],{"class":1485},[1053,16977,1489],{"class":1481},[1053,16979,2467],{"class":1066},[1053,16981,16864],{"class":1070},[1053,16983,10427],{"class":1066},[1053,16985,1482],{"class":1481},[1053,16987,16871],{"class":1485},[1053,16989,10435],{"class":1481},[1053,16991,16992,16995,16997,16999],{"class":1055,"line":1834},[1053,16993,16994],{"class":1187},"        DUAL_WRITE_OPERATIONS",[1053,16996,1191],{"class":1096},[1053,16998,16883],{"class":1260},[1053,17000,5688],{"class":1096},[1053,17002,17003,17006,17008,17010],{"class":1055,"line":1856},[1053,17004,17005],{"class":5736},"            operation",[1053,17007,1521],{"class":1096},[1053,17009,16646],{"class":1260},[1053,17011,2402],{"class":1096},[1053,17013,17014,17016,17018],{"class":1055,"line":1886},[1053,17015,14748],{"class":5736},[1053,17017,1521],{"class":1096},[1053,17019,16916],{"class":1260},[1053,17021,17022,17024,17026],{"class":1055,"line":1891},[1053,17023,14761],{"class":1096},[1053,17025,16923],{"class":1260},[1053,17027,1333],{"class":1096},[1053,17029,17030],{"class":1055,"line":1905},[1053,17031,1155],{"class":1070},[1053,17033,17034,17036],{"class":1055,"line":1915},[1053,17035,16807],{"class":1096},[1053,17037,16810],{"class":1265},[1053,17039,17040,17042,17045,17047,17049,17051,17053,17055,17057],{"class":1055,"line":1932},[1053,17041,1161],{"class":1127},[1053,17043,17044],{"class":1302}," record_saga_execution",[1053,17046,1168],{"class":1096},[1053,17048,13766],{"class":1177},[1053,17050,1097],{"class":1096},[1053,17052,16831],{"class":1177},[1053,17054,1521],{"class":1492},[1053,17056,5769],{"class":5768},[1053,17058,1181],{"class":1096},[1053,17060,17061,17063,17066],{"class":1055,"line":1964},[1053,17062,1315],{"class":1141},[1053,17064,17065],{"class":1145},"Record saga execution",[1053,17067,1149],{"class":1141},[1053,17069,17070,17072,17074,17076,17078,17080,17082,17084,17086,17088,17090],{"class":1055,"line":1995},[1053,17071,16851],{"class":1070},[1053,17073,1521],{"class":1096},[1053,17075,1482],{"class":1481},[1053,17077,8560],{"class":1485},[1053,17079,1489],{"class":1481},[1053,17081,2467],{"class":1066},[1053,17083,16864],{"class":1070},[1053,17085,10427],{"class":1066},[1053,17087,1482],{"class":1481},[1053,17089,16871],{"class":1485},[1053,17091,10435],{"class":1481},[1053,17093,17094,17097,17099,17101],{"class":1055,"line":2011},[1053,17095,17096],{"class":1187},"        SAGA_EXECUTIONS",[1053,17098,1191],{"class":1096},[1053,17100,16883],{"class":1260},[1053,17102,5688],{"class":1096},[1053,17104,17105,17108,17110,17112],{"class":1055,"line":2035},[1053,17106,17107],{"class":5736},"            saga_type",[1053,17109,1521],{"class":1096},[1053,17111,13766],{"class":1260},[1053,17113,2402],{"class":1096},[1053,17115,17116,17118,17120],{"class":1055,"line":2063},[1053,17117,14748],{"class":5736},[1053,17119,1521],{"class":1096},[1053,17121,16916],{"class":1260},[1053,17123,17124,17126,17128],{"class":1055,"line":2085},[1053,17125,14761],{"class":1096},[1053,17127,16923],{"class":1260},[1053,17129,1333],{"class":1096},[1053,17131,17132],{"class":1055,"line":2112},[1053,17133,1155],{"class":1070},[1053,17135,17136,17138],{"class":1055,"line":2117},[1053,17137,16807],{"class":1096},[1053,17139,16810],{"class":1265},[1053,17141,17142,17144,17147,17149,17151,17153,17156],{"class":1055,"line":2136},[1053,17143,1161],{"class":1127},[1053,17145,17146],{"class":1302}," update_migration_progress",[1053,17148,1168],{"class":1096},[1053,17150,10064],{"class":1177},[1053,17152,1097],{"class":1096},[1053,17154,17155],{"class":1177}," percentage",[1053,17157,1181],{"class":1096},[1053,17159,17160,17162,17165],{"class":1055,"line":2146},[1053,17161,1315],{"class":1141},[1053,17163,17164],{"class":1145},"Update migration progress",[1053,17166,1149],{"class":1141},[1053,17168,17169,17172,17174,17176,17178,17180,17182,17184,17186,17188,17190,17192],{"class":1055,"line":2179},[1053,17170,17171],{"class":1187},"        MIGRATION_PROGRESS",[1053,17173,1191],{"class":1096},[1053,17175,16883],{"class":1260},[1053,17177,1168],{"class":1096},[1053,17179,10064],{"class":5736},[1053,17181,1521],{"class":1096},[1053,17183,10064],{"class":1260},[1053,17185,7366],{"class":1096},[1053,17187,1266],{"class":1260},[1053,17189,1168],{"class":1096},[1053,17191,6500],{"class":1260},[1053,17193,1269],{"class":1096},[1053,17195,17196],{"class":1055,"line":2196},[1053,17197,1121],{"emptyLinePlaceholder":1120},[1053,17199,17200,17202,17205],{"class":1055,"line":2201},[1053,17201,1128],{"class":1127},[1053,17203,17204],{"class":1131}," MigrationDashboard",[1053,17206,1135],{"class":1096},[1053,17208,17209,17211,17214],{"class":1055,"line":2209},[1053,17210,1142],{"class":1141},[1053,17212,17213],{"class":1145},"Generate migration progress dashboard",[1053,17215,1149],{"class":1141},[1053,17217,17218],{"class":1055,"line":2232},[1053,17219,1155],{"class":1070},[1053,17221,17222,17224,17226,17228,17230],{"class":1055,"line":2242},[1053,17223,1161],{"class":1127},[1053,17225,1165],{"class":1164},[1053,17227,1168],{"class":1096},[1053,17229,1172],{"class":1171},[1053,17231,1181],{"class":1096},[1053,17233,17234,17236,17238,17241,17243,17245],{"class":1055,"line":2248},[1053,17235,1188],{"class":1187},[1053,17237,1191],{"class":1096},[1053,17239,17240],{"class":1194},"metrics",[1053,17242,1198],{"class":1096},[1053,17244,16787],{"class":1260},[1053,17246,1333],{"class":1096},[1053,17248,17249],{"class":1055,"line":2271},[1053,17250,1155],{"class":1070},[1053,17252,17253,17255,17258,17260,17262],{"class":1055,"line":2295},[1053,17254,1161],{"class":1127},[1053,17256,17257],{"class":1302}," get_migration_status",[1053,17259,1168],{"class":1096},[1053,17261,1172],{"class":1171},[1053,17263,1181],{"class":1096},[1053,17265,17266,17268,17271],{"class":1055,"line":2301},[1053,17267,1315],{"class":1141},[1053,17269,17270],{"class":1145},"Get overall migration status",[1053,17272,1149],{"class":1141},[1053,17274,17275,17277],{"class":1055,"line":2322},[1053,17276,1393],{"class":1066},[1053,17278,3536],{"class":1096},[1053,17280,17281,17283,17285,17287,17289,17291,17293,17296],{"class":1055,"line":2369},[1053,17282,3542],{"class":1481},[1053,17284,5512],{"class":1485},[1053,17286,1489],{"class":1481},[1053,17288,2393],{"class":1096},[1053,17290,1396],{"class":1187},[1053,17292,1191],{"class":1096},[1053,17294,17295],{"class":1260},"_get_user_service_progress",[1053,17297,8349],{"class":1096},[1053,17299,17300,17302,17304,17306,17308,17310,17312,17315],{"class":1055,"line":2382},[1053,17301,3542],{"class":1481},[1053,17303,5542],{"class":1485},[1053,17305,1489],{"class":1481},[1053,17307,2393],{"class":1096},[1053,17309,1396],{"class":1187},[1053,17311,1191],{"class":1096},[1053,17313,17314],{"class":1260},"_get_product_service_progress",[1053,17316,8349],{"class":1096},[1053,17318,17319,17321,17323,17325,17327,17329,17331,17334],{"class":1055,"line":2405},[1053,17320,3542],{"class":1481},[1053,17322,5572],{"class":1485},[1053,17324,1489],{"class":1481},[1053,17326,2393],{"class":1096},[1053,17328,1396],{"class":1187},[1053,17330,1191],{"class":1096},[1053,17332,17333],{"class":1260},"_get_order_service_progress",[1053,17335,8349],{"class":1096},[1053,17337,17338,17340,17343,17345,17347,17349,17351,17354],{"class":1055,"line":2431},[1053,17339,3542],{"class":1481},[1053,17341,17342],{"class":1485},"overall_progress",[1053,17344,1489],{"class":1481},[1053,17346,2393],{"class":1096},[1053,17348,1396],{"class":1187},[1053,17350,1191],{"class":1096},[1053,17352,17353],{"class":1260},"_calculate_overall_progress",[1053,17355,1333],{"class":1096},[1053,17357,17358],{"class":1055,"line":2488},[1053,17359,3818],{"class":1096},[1053,17361,17362],{"class":1055,"line":2494},[1053,17363,1155],{"class":1070},[1053,17365,17366,17368,17371,17373,17375],{"class":1055,"line":2499},[1053,17367,1161],{"class":1127},[1053,17369,17370],{"class":1302}," _get_user_service_progress",[1053,17372,1168],{"class":1096},[1053,17374,1172],{"class":1171},[1053,17376,1181],{"class":1096},[1053,17378,17379,17381,17384],{"class":1055,"line":2508},[1053,17380,1315],{"class":1141},[1053,17382,17383],{"class":1145},"Get user service migration progress",[1053,17385,1149],{"class":1141},[1053,17387,17388,17390,17392,17394,17396,17398,17400,17402],{"class":1055,"line":2519},[1053,17389,7802],{"class":1070},[1053,17391,1521],{"class":1096},[1053,17393,7807],{"class":1070},[1053,17395,1191],{"class":1096},[1053,17397,7812],{"class":1194},[1053,17399,1191],{"class":1096},[1053,17401,7817],{"class":1260},[1053,17403,1333],{"class":1096},[1053,17405,17406,17409,17411,17413,17415,17418],{"class":1055,"line":2526},[1053,17407,17408],{"class":1070},"        migrated_users ",[1053,17410,1521],{"class":1096},[1053,17412,1396],{"class":1187},[1053,17414,1191],{"class":1096},[1053,17416,17417],{"class":1260},"_count_migrated_users",[1053,17419,1333],{"class":1096},[1053,17421,17422],{"class":1055,"line":2531},[1053,17423,1387],{"class":1070},[1053,17425,17426,17429,17431,17433,17436,17438,17441,17443,17445,17447,17449,17451,17454,17456,17458],{"class":1055,"line":2550},[1053,17427,17428],{"class":1070},"        progress ",[1053,17430,1521],{"class":1096},[1053,17432,3084],{"class":1096},[1053,17434,17435],{"class":1070},"migrated_users ",[1053,17437,6614],{"class":1492},[1053,17439,17440],{"class":1070}," total_users ",[1053,17442,4435],{"class":1492},[1053,17444,6481],{"class":3044},[1053,17446,2168],{"class":1096},[1053,17448,2467],{"class":1066},[1053,17450,17440],{"class":1070},[1053,17452,17453],{"class":1492},">",[1053,17455,4366],{"class":3044},[1053,17457,2932],{"class":1066},[1053,17459,4807],{"class":3044},[1053,17461,17462,17464,17466,17468,17470,17473,17475,17477,17479,17481,17483,17486],{"class":1055,"line":2560},[1053,17463,1188],{"class":1187},[1053,17465,1191],{"class":1096},[1053,17467,17240],{"class":1194},[1053,17469,1191],{"class":1096},[1053,17471,17472],{"class":1260},"update_migration_progress",[1053,17474,1168],{"class":1096},[1053,17476,1489],{"class":1481},[1053,17478,11460],{"class":1485},[1053,17480,1489],{"class":1481},[1053,17482,1097],{"class":1096},[1053,17484,17485],{"class":1260}," progress",[1053,17487,1269],{"class":1096},[1053,17489,17490],{"class":1055,"line":2570},[1053,17491,1387],{"class":1070},[1053,17493,17494,17496],{"class":1055,"line":2587},[1053,17495,1393],{"class":1066},[1053,17497,3536],{"class":1096},[1053,17499,17500,17502,17505,17507,17509,17511],{"class":1055,"line":2609},[1053,17501,3542],{"class":1481},[1053,17503,17504],{"class":1485},"total_records",[1053,17506,1489],{"class":1481},[1053,17508,2393],{"class":1096},[1053,17510,7885],{"class":1070},[1053,17512,2402],{"class":1096},[1053,17514,17515,17517,17520,17522,17524,17527],{"class":1055,"line":2628},[1053,17516,3542],{"class":1481},[1053,17518,17519],{"class":1485},"migrated_records",[1053,17521,1489],{"class":1481},[1053,17523,2393],{"class":1096},[1053,17525,17526],{"class":1070}," migrated_users",[1053,17528,2402],{"class":1096},[1053,17530,17531,17533,17536,17538,17540,17542],{"class":1055,"line":2651},[1053,17532,3542],{"class":1481},[1053,17534,17535],{"class":1485},"progress_percent",[1053,17537,1489],{"class":1481},[1053,17539,2393],{"class":1096},[1053,17541,17485],{"class":1070},[1053,17543,2402],{"class":1096},[1053,17545,17546,17548,17550,17552,17554,17556,17559,17561,17563,17566,17569,17571,17573,17575,17577],{"class":1055,"line":2672},[1053,17547,3542],{"class":1481},[1053,17549,14059],{"class":1485},[1053,17551,1489],{"class":1481},[1053,17553,2393],{"class":1096},[1053,17555,1482],{"class":1481},[1053,17557,17558],{"class":1485},"in_progress",[1053,17560,1489],{"class":1481},[1053,17562,2467],{"class":1066},[1053,17564,17565],{"class":1070}," progress ",[1053,17567,17568],{"class":1492},"\u003C",[1053,17570,6481],{"class":3044},[1053,17572,2932],{"class":1066},[1053,17574,1482],{"class":1481},[1053,17576,12549],{"class":1485},[1053,17578,10435],{"class":1481},[1053,17580,17581],{"class":1055,"line":2680},[1053,17582,3818],{"class":1096},[1053,17584,17585],{"class":1055,"line":2685},[1053,17586,1155],{"class":1070},[1053,17588,17589,17591,17594,17596,17598],{"class":1055,"line":2704},[1053,17590,1161],{"class":1127},[1053,17592,17593],{"class":1302}," _count_migrated_users",[1053,17595,1168],{"class":1096},[1053,17597,1172],{"class":1171},[1053,17599,1181],{"class":1096},[1053,17601,17602,17604,17607],{"class":1055,"line":2714},[1053,17603,1315],{"class":1141},[1053,17605,17606],{"class":1145},"Count users that have been migrated",[1053,17608,1149],{"class":1141},[1053,17610,17611],{"class":1055,"line":2741},[1053,17612,17613],{"class":1059},"        # This would check migration status in your tracking system\n",[1053,17615,17616],{"class":1055,"line":2756},[1053,17617,17618],{"class":1059},"        # For example, checking if user exists in microservice\n",[1053,17620,17621,17624,17626],{"class":1055,"line":2761},[1053,17622,17623],{"class":1070},"        migrated_count ",[1053,17625,1521],{"class":1096},[1053,17627,4807],{"class":3044},[1053,17629,17630],{"class":1055,"line":2768},[1053,17631,1387],{"class":1070},[1053,17633,17634,17636],{"class":1055,"line":2787},[1053,17635,2204],{"class":1066},[1053,17637,1135],{"class":1096},[1053,17639,17640,17643,17645,17647,17649,17651],{"class":1055,"line":2797},[1053,17641,17642],{"class":1070},"            response ",[1053,17644,1521],{"class":1096},[1053,17646,6692],{"class":1070},[1053,17648,1191],{"class":1096},[1053,17650,4357],{"class":1260},[1053,17652,5688],{"class":1096},[1053,17654,17655,17657,17659,17661,17663,17665,17667,17669,17672],{"class":1055,"line":2802},[1053,17656,15847],{"class":1127},[1053,17658,5467],{"class":1485},[1053,17660,3886],{"class":3885},[1053,17662,6231],{"class":1260},[1053,17664,1191],{"class":1096},[1053,17666,8428],{"class":6715},[1053,17668,3907],{"class":3885},[1053,17670,17671],{"class":1485},"/api/v1/users/count/\"",[1053,17673,2402],{"class":1096},[1053,17675,17676,17678,17680,17682,17684,17686,17688,17690,17692,17694],{"class":1055,"line":2823},[1053,17677,7376],{"class":5736},[1053,17679,8455],{"class":1096},[1053,17681,1489],{"class":1481},[1053,17683,7408],{"class":1485},[1053,17685,1489],{"class":1481},[1053,17687,2393],{"class":1096},[1053,17689,7417],{"class":1260},[1053,17691,1191],{"class":1096},[1053,17693,8470],{"class":6715},[1053,17695,7594],{"class":1096},[1053,17697,17698],{"class":1055,"line":2863},[1053,17699,7015],{"class":1096},[1053,17701,17702],{"class":1055,"line":2875},[1053,17703,2245],{"class":1070},[1053,17705,17706,17708,17710,17712,17714,17716,17718],{"class":1055,"line":2895},[1053,17707,1478],{"class":1066},[1053,17709,7041],{"class":1070},[1053,17711,1191],{"class":1096},[1053,17713,6971],{"class":1194},[1053,17715,2357],{"class":1492},[1053,17717,9658],{"class":3044},[1053,17719,1135],{"class":1096},[1053,17721,17722,17725,17727,17729,17731,17733,17735,17737,17739,17741,17743,17745,17747,17749],{"class":1055,"line":2943},[1053,17723,17724],{"class":1070},"                migrated_count ",[1053,17726,1521],{"class":1096},[1053,17728,7041],{"class":1070},[1053,17730,1191],{"class":1096},[1053,17732,11025],{"class":1260},[1053,17734,8604],{"class":1096},[1053,17736,4357],{"class":1260},[1053,17738,1168],{"class":1096},[1053,17740,1489],{"class":1481},[1053,17742,7817],{"class":1485},[1053,17744,1489],{"class":1481},[1053,17746,1097],{"class":1096},[1053,17748,4366],{"class":3044},[1053,17750,1269],{"class":1096},[1053,17752,17753,17755],{"class":1055,"line":2968},[1053,17754,2511],{"class":1066},[1053,17756,1135],{"class":1096},[1053,17758,17759],{"class":1055,"line":2974},[1053,17760,3486],{"class":1066},[1053,17762,17763],{"class":1055,"line":2979},[1053,17764,1387],{"class":1070},[1053,17766,17767,17769],{"class":1055,"line":2987},[1053,17768,1393],{"class":1066},[1053,17770,17771],{"class":1070}," migrated_count\n",[1053,17773,17774],{"class":1055,"line":2996},[1053,17775,1155],{"class":1070},[1053,17777,17778,17780,17783,17785,17787],{"class":1055,"line":3003},[1053,17779,1161],{"class":1127},[1053,17781,17782],{"class":1302}," _calculate_overall_progress",[1053,17784,1168],{"class":1096},[1053,17786,1172],{"class":1171},[1053,17788,1181],{"class":1096},[1053,17790,17791,17793,17796],{"class":1055,"line":3008},[1053,17792,1315],{"class":1141},[1053,17794,17795],{"class":1145},"Calculate overall migration progress",[1053,17797,1149],{"class":1141},[1053,17799,17800],{"class":1055,"line":3026},[1053,17801,17802],{"class":1059},"        # This would aggregate progress from all services\n",[1053,17804,17805,17807,17810],{"class":1055,"line":3036},[1053,17806,1393],{"class":1066},[1053,17808,17809],{"class":3044}," 45.5",[1053,17811,17812],{"class":1059},"  # Example percentage\n",[1030,17814,17816],{"id":17815},"rollback-strategies","Rollback Strategies",[1035,17818,17820],{"id":17819},"_1-feature-flags-for-rollback","1. Feature Flags for Rollback",[1043,17822,17824],{"className":1045,"code":17823,"language":1047,"meta":1048,"style":1048},"# feature_flags.py\nfrom django.conf import settings\nfrom django.core.cache import cache\nimport requests\n\nclass FeatureFlagManager:\n    \"\"\"Manage feature flags for migration rollback\"\"\"\n    \n    def __init__(self):\n        self.flags = {}\n        self.load_flags()\n    \n    def load_flags(self):\n        \"\"\"Load feature flags from configuration\"\"\"\n        self.flags = getattr(settings, 'FEATURE_FLAGS', {\n            'use_user_microservice': False,\n            'use_product_microservice': False,\n            'use_order_microservice': False,\n            'enable_dual_write': True,\n            'enable_event_publishing': True\n        })\n    \n    def is_enabled(self, flag_name):\n        \"\"\"Check if feature flag is enabled\"\"\"\n        # Check cache first\n        cache_key = f\"feature_flag:{flag_name}\"\n        cached_value = cache.get(cache_key)\n        \n        if cached_value is not None:\n            return cached_value\n        \n        # Get from configuration\n        enabled = self.flags.get(flag_name, False)\n        \n        # Cache for 5 minutes\n        cache.set(cache_key, enabled, timeout=300)\n        \n        return enabled\n    \n    def set_flag(self, flag_name, enabled):\n        \"\"\"Set feature flag value\"\"\"\n        self.flags[flag_name] = enabled\n        \n        # Update cache\n        cache_key = f\"feature_flag:{flag_name}\"\n        cache.set(cache_key, enabled, timeout=300)\n        \n        # Optionally persist to external configuration service\n        self._persist_flag(flag_name, enabled)\n    \n    def _persist_flag(self, flag_name, enabled):\n        \"\"\"Persist flag to external service\"\"\"\n        try:\n            requests.post(\n                f\"{settings.CONFIG_SERVICE_URL}/api/v1/flags/\",\n                json={\n                    'name': flag_name,\n                    'enabled': enabled,\n                    'service': settings.SERVICE_NAME\n                },\n                headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n            )\n        except:\n            pass\n\n# Usage in views\nfeature_flags = FeatureFlagManager()\n\nclass UserViewSet(ModelViewSet):\n    \n    def create(self, request):\n        \"\"\"Create user with feature flag support\"\"\"\n        if feature_flags.is_enabled('use_user_microservice'):\n            return self._create_in_microservice(request)\n        else:\n            return self._create_in_monolith(request)\n    \n    def _create_in_microservice(self, request):\n        \"\"\"Create user in microservice\"\"\"\n        try:\n            response = requests.post(\n                f\"{settings.USER_SERVICE_URL}/api/v1/users/\",\n                json=request.data,\n                headers={'X-Service-Token': settings.SERVICE_SECRET_TOKEN}\n            )\n            \n            if response.status_code == 201:\n                return Response(response.json(), status=201)\n            else:\n                # Fallback to monolith on error\n                logger.warning(\"Microservice failed, falling back to monolith\")\n                return self._create_in_monolith(request)\n                \n        except Exception as e:\n            logger.error(f\"Microservice error: {e}\")\n            return self._create_in_monolith(request)\n    \n    def _create_in_monolith(self, request):\n        \"\"\"Create user in monolith\"\"\"\n        return super().create(request)\n\n# Emergency rollback command\nfrom django.core.management.base import BaseCommand\n\nclass Command(BaseCommand):\n    help = 'Emergency rollback to monolith'\n    \n    def handle(self, *args, **options):\n        \"\"\"Perform emergency rollback\"\"\"\n        feature_flags = FeatureFlagManager()\n        \n        # Disable all microservice flags\n        flags_to_disable = [\n            'use_user_microservice',\n            'use_product_microservice',\n            'use_order_microservice'\n        ]\n        \n        for flag in flags_to_disable:\n            feature_flags.set_flag(flag, False)\n            self.stdout.write(f\"Disabled {flag}\")\n        \n        # Clear relevant caches\n        cache.clear()\n        \n        self.stdout.write(\n            self.style.SUCCESS('Emergency rollback completed')\n        )\n",[1050,17825,17826,17831,17845,17866,17872,17876,17885,17894,17898,17910,17923,17934,17938,17951,17960,17989,18004,18019,18034,18050,18064,18068,18072,18090,18099,18104,18125,18146,18150,18167,18174,18178,18183,18210,18214,18219,18249,18253,18260,18264,18285,18294,18312,18316,18321,18339,18365,18369,18374,18393,18397,18418,18427,18433,18443,18465,18473,18488,18502,18519,18524,18546,18550,18556,18560,18564,18569,18580,18584,18598,18602,18619,18628,18650,18667,18673,18689,18693,18710,18719,18725,18739,18759,18773,18795,18799,18803,18819,18847,18853,18858,18877,18893,18897,18909,18934,18950,18954,18970,18978,18995,18999,19004,19029,19033,19047,19061,19065,19093,19102,19113,19117,19122,19131,19141,19151,19159,19164,19168,19182,19203,19234,19238,19243,19254,19258,19272,19297],{"__ignoreMap":1048},[1053,17827,17828],{"class":1055,"line":1056},[1053,17829,17830],{"class":1059},"# feature_flags.py\n",[1053,17832,17833,17835,17837,17839,17841,17843],{"class":1055,"line":1063},[1053,17834,1085],{"class":1066},[1053,17836,6067],{"class":1070},[1053,17838,1191],{"class":1096},[1053,17840,6109],{"class":1070},[1053,17842,1067],{"class":1066},[1053,17844,6114],{"class":1070},[1053,17846,17847,17849,17851,17853,17856,17858,17861,17863],{"class":1055,"line":1074},[1053,17848,1085],{"class":1066},[1053,17850,6067],{"class":1070},[1053,17852,1191],{"class":1096},[1053,17854,17855],{"class":1070},"core",[1053,17857,1191],{"class":1096},[1053,17859,17860],{"class":1070},"cache ",[1053,17862,1067],{"class":1066},[1053,17864,17865],{"class":1070}," cache\n",[1053,17867,17868,17870],{"class":1055,"line":1082},[1053,17869,1067],{"class":1066},[1053,17871,6121],{"class":1070},[1053,17873,17874],{"class":1055,"line":1103},[1053,17875,1121],{"emptyLinePlaceholder":1120},[1053,17877,17878,17880,17883],{"class":1055,"line":1117},[1053,17879,1128],{"class":1127},[1053,17881,17882],{"class":1131}," FeatureFlagManager",[1053,17884,1135],{"class":1096},[1053,17886,17887,17889,17892],{"class":1055,"line":1124},[1053,17888,1142],{"class":1141},[1053,17890,17891],{"class":1145},"Manage feature flags for migration rollback",[1053,17893,1149],{"class":1141},[1053,17895,17896],{"class":1055,"line":1138},[1053,17897,1155],{"class":1070},[1053,17899,17900,17902,17904,17906,17908],{"class":1055,"line":1152},[1053,17901,1161],{"class":1127},[1053,17903,1165],{"class":1164},[1053,17905,1168],{"class":1096},[1053,17907,1172],{"class":1171},[1053,17909,1181],{"class":1096},[1053,17911,17912,17914,17916,17919,17921],{"class":1055,"line":1158},[1053,17913,1188],{"class":1187},[1053,17915,1191],{"class":1096},[1053,17917,17918],{"class":1194},"flags",[1053,17920,1198],{"class":1096},[1053,17922,1231],{"class":1096},[1053,17924,17925,17927,17929,17932],{"class":1055,"line":1184},[1053,17926,1188],{"class":1187},[1053,17928,1191],{"class":1096},[1053,17930,17931],{"class":1260},"load_flags",[1053,17933,1333],{"class":1096},[1053,17935,17936],{"class":1055,"line":1204},[1053,17937,1155],{"class":1070},[1053,17939,17940,17942,17945,17947,17949],{"class":1055,"line":1219},[1053,17941,1161],{"class":1127},[1053,17943,17944],{"class":1302}," load_flags",[1053,17946,1168],{"class":1096},[1053,17948,1172],{"class":1171},[1053,17950,1181],{"class":1096},[1053,17952,17953,17955,17958],{"class":1055,"line":1234},[1053,17954,1315],{"class":1141},[1053,17956,17957],{"class":1145},"Load feature flags from configuration",[1053,17959,1149],{"class":1141},[1053,17961,17962,17964,17966,17968,17970,17972,17974,17976,17978,17980,17983,17985,17987],{"class":1055,"line":1248},[1053,17963,1188],{"class":1187},[1053,17965,1191],{"class":1096},[1053,17967,17918],{"class":1194},[1053,17969,1198],{"class":1096},[1053,17971,6226],{"class":1164},[1053,17973,1168],{"class":1096},[1053,17975,6231],{"class":1260},[1053,17977,1097],{"class":1096},[1053,17979,1482],{"class":1481},[1053,17981,17982],{"class":1485},"FEATURE_FLAGS",[1053,17984,1489],{"class":1481},[1053,17986,1097],{"class":1096},[1053,17988,3536],{"class":1096},[1053,17990,17991,17993,17996,17998,18000,18002],{"class":1055,"line":1272},[1053,17992,3542],{"class":1481},[1053,17994,17995],{"class":1485},"use_user_microservice",[1053,17997,1489],{"class":1481},[1053,17999,2393],{"class":1096},[1053,18001,8682],{"class":5768},[1053,18003,2402],{"class":1096},[1053,18005,18006,18008,18011,18013,18015,18017],{"class":1055,"line":1292},[1053,18007,3542],{"class":1481},[1053,18009,18010],{"class":1485},"use_product_microservice",[1053,18012,1489],{"class":1481},[1053,18014,2393],{"class":1096},[1053,18016,8682],{"class":5768},[1053,18018,2402],{"class":1096},[1053,18020,18021,18023,18026,18028,18030,18032],{"class":1055,"line":1297},[1053,18022,3542],{"class":1481},[1053,18024,18025],{"class":1485},"use_order_microservice",[1053,18027,1489],{"class":1481},[1053,18029,2393],{"class":1096},[1053,18031,8682],{"class":5768},[1053,18033,2402],{"class":1096},[1053,18035,18036,18038,18041,18043,18045,18048],{"class":1055,"line":1312},[1053,18037,3542],{"class":1481},[1053,18039,18040],{"class":1485},"enable_dual_write",[1053,18042,1489],{"class":1481},[1053,18044,2393],{"class":1096},[1053,18046,18047],{"class":5768}," True",[1053,18049,2402],{"class":1096},[1053,18051,18052,18054,18057,18059,18061],{"class":1055,"line":1323},[1053,18053,3542],{"class":1481},[1053,18055,18056],{"class":1485},"enable_event_publishing",[1053,18058,1489],{"class":1481},[1053,18060,2393],{"class":1096},[1053,18062,18063],{"class":5768}," True\n",[1053,18065,18066],{"class":1055,"line":1336},[1053,18067,8613],{"class":1096},[1053,18069,18070],{"class":1055,"line":1348},[1053,18071,1155],{"class":1070},[1053,18073,18074,18076,18079,18081,18083,18085,18088],{"class":1055,"line":1360},[1053,18075,1161],{"class":1127},[1053,18077,18078],{"class":1302}," is_enabled",[1053,18080,1168],{"class":1096},[1053,18082,1172],{"class":1171},[1053,18084,1097],{"class":1096},[1053,18086,18087],{"class":1177}," flag_name",[1053,18089,1181],{"class":1096},[1053,18091,18092,18094,18097],{"class":1055,"line":1372},[1053,18093,1315],{"class":1141},[1053,18095,18096],{"class":1145},"Check if feature flag is enabled",[1053,18098,1149],{"class":1141},[1053,18100,18101],{"class":1055,"line":1384},[1053,18102,18103],{"class":1059},"        # Check cache first\n",[1053,18105,18106,18109,18111,18113,18116,18118,18121,18123],{"class":1055,"line":1390},[1053,18107,18108],{"class":1070},"        cache_key ",[1053,18110,1521],{"class":1096},[1053,18112,2174],{"class":1127},[1053,18114,18115],{"class":1485},"\"feature_flag:",[1053,18117,3886],{"class":3885},[1053,18119,18120],{"class":1070},"flag_name",[1053,18122,3907],{"class":3885},[1053,18124,5436],{"class":1485},[1053,18126,18127,18130,18132,18135,18137,18139,18141,18144],{"class":1055,"line":1406},[1053,18128,18129],{"class":1070},"        cached_value ",[1053,18131,1521],{"class":1096},[1053,18133,18134],{"class":1070}," cache",[1053,18136,1191],{"class":1096},[1053,18138,4357],{"class":1260},[1053,18140,1168],{"class":1096},[1053,18142,18143],{"class":1260},"cache_key",[1053,18145,1269],{"class":1096},[1053,18147,18148],{"class":1055,"line":1411},[1053,18149,1387],{"class":1070},[1053,18151,18152,18154,18157,18160,18162,18165],{"class":1055,"line":1425},[1053,18153,6302],{"class":1066},[1053,18155,18156],{"class":1070}," cached_value ",[1053,18158,18159],{"class":1492},"is",[1053,18161,7068],{"class":1492},[1053,18163,18164],{"class":5768}," None",[1053,18166,1135],{"class":1096},[1053,18168,18169,18171],{"class":1055,"line":1435},[1053,18170,2502],{"class":1066},[1053,18172,18173],{"class":1070}," cached_value\n",[1053,18175,18176],{"class":1055,"line":1475},[1053,18177,1387],{"class":1070},[1053,18179,18180],{"class":1055,"line":1515},[1053,18181,18182],{"class":1059},"        # Get from configuration\n",[1053,18184,18185,18188,18190,18192,18194,18196,18198,18200,18202,18204,18206,18208],{"class":1055,"line":1543},[1053,18186,18187],{"class":1070},"        enabled ",[1053,18189,1521],{"class":1096},[1053,18191,1396],{"class":1187},[1053,18193,1191],{"class":1096},[1053,18195,17918],{"class":1194},[1053,18197,1191],{"class":1096},[1053,18199,4357],{"class":1260},[1053,18201,1168],{"class":1096},[1053,18203,18120],{"class":1260},[1053,18205,1097],{"class":1096},[1053,18207,8682],{"class":5768},[1053,18209,1269],{"class":1096},[1053,18211,18212],{"class":1055,"line":1579},[1053,18213,1387],{"class":1070},[1053,18215,18216],{"class":1055,"line":1601},[1053,18217,18218],{"class":1059},"        # Cache for 5 minutes\n",[1053,18220,18221,18224,18226,18228,18230,18232,18234,18237,18239,18242,18244,18247],{"class":1055,"line":1606},[1053,18222,18223],{"class":1070},"        cache",[1053,18225,1191],{"class":1096},[1053,18227,1266],{"class":1260},[1053,18229,1168],{"class":1096},[1053,18231,18143],{"class":1260},[1053,18233,1097],{"class":1096},[1053,18235,18236],{"class":1260}," enabled",[1053,18238,1097],{"class":1096},[1053,18240,18241],{"class":5736}," timeout",[1053,18243,1521],{"class":1096},[1053,18245,18246],{"class":3044},"300",[1053,18248,1269],{"class":1096},[1053,18250,18251],{"class":1055,"line":1620},[1053,18252,1387],{"class":1070},[1053,18254,18255,18257],{"class":1055,"line":1630},[1053,18256,1393],{"class":1066},[1053,18258,18259],{"class":1070}," enabled\n",[1053,18261,18262],{"class":1055,"line":1648},[1053,18263,1155],{"class":1070},[1053,18265,18266,18268,18271,18273,18275,18277,18279,18281,18283],{"class":1055,"line":1690},[1053,18267,1161],{"class":1127},[1053,18269,18270],{"class":1302}," set_flag",[1053,18272,1168],{"class":1096},[1053,18274,1172],{"class":1171},[1053,18276,1097],{"class":1096},[1053,18278,18087],{"class":1177},[1053,18280,1097],{"class":1096},[1053,18282,18236],{"class":1177},[1053,18284,1181],{"class":1096},[1053,18286,18287,18289,18292],{"class":1055,"line":1713},[1053,18288,1315],{"class":1141},[1053,18290,18291],{"class":1145},"Set feature flag value",[1053,18293,1149],{"class":1141},[1053,18295,18296,18298,18300,18302,18304,18306,18308,18310],{"class":1055,"line":1747},[1053,18297,1188],{"class":1187},[1053,18299,1191],{"class":1096},[1053,18301,17918],{"class":1194},[1053,18303,1723],{"class":1096},[1053,18305,18120],{"class":1194},[1053,18307,1729],{"class":1096},[1053,18309,1198],{"class":1096},[1053,18311,18259],{"class":1070},[1053,18313,18314],{"class":1055,"line":1752},[1053,18315,1387],{"class":1070},[1053,18317,18318],{"class":1055,"line":1766},[1053,18319,18320],{"class":1059},"        # Update cache\n",[1053,18322,18323,18325,18327,18329,18331,18333,18335,18337],{"class":1055,"line":1776},[1053,18324,18108],{"class":1070},[1053,18326,1521],{"class":1096},[1053,18328,2174],{"class":1127},[1053,18330,18115],{"class":1485},[1053,18332,3886],{"class":3885},[1053,18334,18120],{"class":1070},[1053,18336,3907],{"class":3885},[1053,18338,5436],{"class":1485},[1053,18340,18341,18343,18345,18347,18349,18351,18353,18355,18357,18359,18361,18363],{"class":1055,"line":1793},[1053,18342,18223],{"class":1070},[1053,18344,1191],{"class":1096},[1053,18346,1266],{"class":1260},[1053,18348,1168],{"class":1096},[1053,18350,18143],{"class":1260},[1053,18352,1097],{"class":1096},[1053,18354,18236],{"class":1260},[1053,18356,1097],{"class":1096},[1053,18358,18241],{"class":5736},[1053,18360,1521],{"class":1096},[1053,18362,18246],{"class":3044},[1053,18364,1269],{"class":1096},[1053,18366,18367],{"class":1055,"line":1834},[1053,18368,1387],{"class":1070},[1053,18370,18371],{"class":1055,"line":1856},[1053,18372,18373],{"class":1059},"        # Optionally persist to external configuration service\n",[1053,18375,18376,18378,18380,18383,18385,18387,18389,18391],{"class":1055,"line":1886},[1053,18377,1188],{"class":1187},[1053,18379,1191],{"class":1096},[1053,18381,18382],{"class":1260},"_persist_flag",[1053,18384,1168],{"class":1096},[1053,18386,18120],{"class":1260},[1053,18388,1097],{"class":1096},[1053,18390,18236],{"class":1260},[1053,18392,1269],{"class":1096},[1053,18394,18395],{"class":1055,"line":1891},[1053,18396,1155],{"class":1070},[1053,18398,18399,18401,18404,18406,18408,18410,18412,18414,18416],{"class":1055,"line":1905},[1053,18400,1161],{"class":1127},[1053,18402,18403],{"class":1302}," _persist_flag",[1053,18405,1168],{"class":1096},[1053,18407,1172],{"class":1171},[1053,18409,1097],{"class":1096},[1053,18411,18087],{"class":1177},[1053,18413,1097],{"class":1096},[1053,18415,18236],{"class":1177},[1053,18417,1181],{"class":1096},[1053,18419,18420,18422,18425],{"class":1055,"line":1915},[1053,18421,1315],{"class":1141},[1053,18423,18424],{"class":1145},"Persist flag to external service",[1053,18426,1149],{"class":1141},[1053,18428,18429,18431],{"class":1055,"line":1932},[1053,18430,2204],{"class":1066},[1053,18432,1135],{"class":1096},[1053,18434,18435,18437,18439,18441],{"class":1055,"line":1964},[1053,18436,15835],{"class":1070},[1053,18438,1191],{"class":1096},[1053,18440,6761],{"class":1260},[1053,18442,5688],{"class":1096},[1053,18444,18445,18447,18449,18451,18453,18455,18458,18460,18463],{"class":1055,"line":1995},[1053,18446,15847],{"class":1127},[1053,18448,5467],{"class":1485},[1053,18450,3886],{"class":3885},[1053,18452,6231],{"class":1260},[1053,18454,1191],{"class":1096},[1053,18456,18457],{"class":6715},"CONFIG_SERVICE_URL",[1053,18459,3907],{"class":3885},[1053,18461,18462],{"class":1485},"/api/v1/flags/\"",[1053,18464,2402],{"class":1096},[1053,18466,18467,18470],{"class":1055,"line":2011},[1053,18468,18469],{"class":5736},"                json",[1053,18471,18472],{"class":1096},"={\n",[1053,18474,18475,18478,18480,18482,18484,18486],{"class":1055,"line":2035},[1053,18476,18477],{"class":1481},"                    '",[1053,18479,2388],{"class":1485},[1053,18481,1489],{"class":1481},[1053,18483,2393],{"class":1096},[1053,18485,18087],{"class":1260},[1053,18487,2402],{"class":1096},[1053,18489,18490,18492,18494,18496,18498,18500],{"class":1055,"line":2063},[1053,18491,18477],{"class":1481},[1053,18493,8660],{"class":1485},[1053,18495,1489],{"class":1481},[1053,18497,2393],{"class":1096},[1053,18499,18236],{"class":1260},[1053,18501,2402],{"class":1096},[1053,18503,18504,18506,18508,18510,18512,18514,18516],{"class":1055,"line":2085},[1053,18505,18477],{"class":1481},[1053,18507,10064],{"class":1485},[1053,18509,1489],{"class":1481},[1053,18511,2393],{"class":1096},[1053,18513,7417],{"class":1260},[1053,18515,1191],{"class":1096},[1053,18517,18518],{"class":6715},"SERVICE_NAME\n",[1053,18520,18521],{"class":1055,"line":2112},[1053,18522,18523],{"class":1096},"                },\n",[1053,18525,18526,18528,18530,18532,18534,18536,18538,18540,18542,18544],{"class":1055,"line":2117},[1053,18527,7376],{"class":5736},[1053,18529,8455],{"class":1096},[1053,18531,1489],{"class":1481},[1053,18533,7408],{"class":1485},[1053,18535,1489],{"class":1481},[1053,18537,2393],{"class":1096},[1053,18539,7417],{"class":1260},[1053,18541,1191],{"class":1096},[1053,18543,8470],{"class":6715},[1053,18545,7594],{"class":1096},[1053,18547,18548],{"class":1055,"line":2136},[1053,18549,7015],{"class":1096},[1053,18551,18552,18554],{"class":1055,"line":2146},[1053,18553,2511],{"class":1066},[1053,18555,1135],{"class":1096},[1053,18557,18558],{"class":1055,"line":2179},[1053,18559,3486],{"class":1066},[1053,18561,18562],{"class":1055,"line":2196},[1053,18563,1121],{"emptyLinePlaceholder":1120},[1053,18565,18566],{"class":1055,"line":2201},[1053,18567,18568],{"class":1059},"# Usage in views\n",[1053,18570,18571,18574,18576,18578],{"class":1055,"line":2209},[1053,18572,18573],{"class":1070},"feature_flags ",[1053,18575,1521],{"class":1096},[1053,18577,17882],{"class":1260},[1053,18579,1333],{"class":1096},[1053,18581,18582],{"class":1055,"line":2232},[1053,18583,1121],{"emptyLinePlaceholder":1120},[1053,18585,18586,18588,18591,18593,18596],{"class":1055,"line":2242},[1053,18587,1128],{"class":1127},[1053,18589,18590],{"class":1131}," UserViewSet",[1053,18592,1168],{"class":1096},[1053,18594,18595],{"class":12507},"ModelViewSet",[1053,18597,1181],{"class":1096},[1053,18599,18600],{"class":1055,"line":2248},[1053,18601,1155],{"class":1070},[1053,18603,18604,18606,18609,18611,18613,18615,18617],{"class":1055,"line":2271},[1053,18605,1161],{"class":1127},[1053,18607,18608],{"class":1302}," create",[1053,18610,1168],{"class":1096},[1053,18612,1172],{"class":1171},[1053,18614,1097],{"class":1096},[1053,18616,6265],{"class":1177},[1053,18618,1181],{"class":1096},[1053,18620,18621,18623,18626],{"class":1055,"line":2295},[1053,18622,1315],{"class":1141},[1053,18624,18625],{"class":1145},"Create user with feature flag support",[1053,18627,1149],{"class":1141},[1053,18629,18630,18632,18635,18637,18640,18642,18644,18646,18648],{"class":1055,"line":2301},[1053,18631,6302],{"class":1066},[1053,18633,18634],{"class":1070}," feature_flags",[1053,18636,1191],{"class":1096},[1053,18638,18639],{"class":1260},"is_enabled",[1053,18641,1168],{"class":1096},[1053,18643,1489],{"class":1481},[1053,18645,17995],{"class":1485},[1053,18647,1489],{"class":1481},[1053,18649,1181],{"class":1096},[1053,18651,18652,18654,18656,18658,18661,18663,18665],{"class":1055,"line":2322},[1053,18653,2502],{"class":1066},[1053,18655,1396],{"class":1187},[1053,18657,1191],{"class":1096},[1053,18659,18660],{"class":1260},"_create_in_microservice",[1053,18662,1168],{"class":1096},[1053,18664,6291],{"class":1260},[1053,18666,1269],{"class":1096},[1053,18668,18669,18671],{"class":1055,"line":2369},[1053,18670,9427],{"class":1066},[1053,18672,1135],{"class":1096},[1053,18674,18675,18677,18679,18681,18683,18685,18687],{"class":1055,"line":2382},[1053,18676,2502],{"class":1066},[1053,18678,1396],{"class":1187},[1053,18680,1191],{"class":1096},[1053,18682,8740],{"class":1260},[1053,18684,1168],{"class":1096},[1053,18686,6291],{"class":1260},[1053,18688,1269],{"class":1096},[1053,18690,18691],{"class":1055,"line":2405},[1053,18692,1155],{"class":1070},[1053,18694,18695,18697,18700,18702,18704,18706,18708],{"class":1055,"line":2431},[1053,18696,1161],{"class":1127},[1053,18698,18699],{"class":1302}," _create_in_microservice",[1053,18701,1168],{"class":1096},[1053,18703,1172],{"class":1171},[1053,18705,1097],{"class":1096},[1053,18707,6265],{"class":1177},[1053,18709,1181],{"class":1096},[1053,18711,18712,18714,18717],{"class":1055,"line":2488},[1053,18713,1315],{"class":1141},[1053,18715,18716],{"class":1145},"Create user in microservice",[1053,18718,1149],{"class":1141},[1053,18720,18721,18723],{"class":1055,"line":2494},[1053,18722,2204],{"class":1066},[1053,18724,1135],{"class":1096},[1053,18726,18727,18729,18731,18733,18735,18737],{"class":1055,"line":2499},[1053,18728,17642],{"class":1070},[1053,18730,1521],{"class":1096},[1053,18732,6692],{"class":1070},[1053,18734,1191],{"class":1096},[1053,18736,6761],{"class":1260},[1053,18738,5688],{"class":1096},[1053,18740,18741,18743,18745,18747,18749,18751,18753,18755,18757],{"class":1055,"line":2508},[1053,18742,15847],{"class":1127},[1053,18744,5467],{"class":1485},[1053,18746,3886],{"class":3885},[1053,18748,6231],{"class":1260},[1053,18750,1191],{"class":1096},[1053,18752,8428],{"class":6715},[1053,18754,3907],{"class":3885},[1053,18756,9338],{"class":1485},[1053,18758,2402],{"class":1096},[1053,18760,18761,18763,18765,18767,18769,18771],{"class":1055,"line":2519},[1053,18762,18469],{"class":5736},[1053,18764,1521],{"class":1096},[1053,18766,6291],{"class":1260},[1053,18768,1191],{"class":1096},[1053,18770,10107],{"class":1194},[1053,18772,2402],{"class":1096},[1053,18774,18775,18777,18779,18781,18783,18785,18787,18789,18791,18793],{"class":1055,"line":2526},[1053,18776,7376],{"class":5736},[1053,18778,8455],{"class":1096},[1053,18780,1489],{"class":1481},[1053,18782,7408],{"class":1485},[1053,18784,1489],{"class":1481},[1053,18786,2393],{"class":1096},[1053,18788,7417],{"class":1260},[1053,18790,1191],{"class":1096},[1053,18792,8470],{"class":6715},[1053,18794,7594],{"class":1096},[1053,18796,18797],{"class":1055,"line":2531},[1053,18798,7015],{"class":1096},[1053,18800,18801],{"class":1055,"line":2550},[1053,18802,2245],{"class":1070},[1053,18804,18805,18807,18809,18811,18813,18815,18817],{"class":1055,"line":2560},[1053,18806,1478],{"class":1066},[1053,18808,7041],{"class":1070},[1053,18810,1191],{"class":1096},[1053,18812,6971],{"class":1194},[1053,18814,2357],{"class":1492},[1053,18816,8497],{"class":3044},[1053,18818,1135],{"class":1096},[1053,18820,18821,18823,18826,18828,18830,18832,18834,18837,18840,18842,18845],{"class":1055,"line":2570},[1053,18822,6913],{"class":1066},[1053,18824,18825],{"class":1260}," Response",[1053,18827,1168],{"class":1096},[1053,18829,6966],{"class":1260},[1053,18831,1191],{"class":1096},[1053,18833,11025],{"class":1260},[1053,18835,18836],{"class":1096},"(),",[1053,18838,18839],{"class":5736}," status",[1053,18841,1521],{"class":1096},[1053,18843,18844],{"class":3044},"201",[1053,18846,1269],{"class":1096},[1053,18848,18849,18851],{"class":1055,"line":2587},[1053,18850,6901],{"class":1066},[1053,18852,1135],{"class":1096},[1053,18854,18855],{"class":1055,"line":2609},[1053,18856,18857],{"class":1059},"                # Fallback to monolith on error\n",[1053,18859,18860,18862,18864,18866,18868,18870,18873,18875],{"class":1055,"line":2628},[1053,18861,14832],{"class":1070},[1053,18863,1191],{"class":1096},[1053,18865,14970],{"class":1260},[1053,18867,1168],{"class":1096},[1053,18869,5467],{"class":1481},[1053,18871,18872],{"class":1485},"Microservice failed, falling back to monolith",[1053,18874,5467],{"class":1481},[1053,18876,1269],{"class":1096},[1053,18878,18879,18881,18883,18885,18887,18889,18891],{"class":1055,"line":2651},[1053,18880,6913],{"class":1066},[1053,18882,1396],{"class":1187},[1053,18884,1191],{"class":1096},[1053,18886,8740],{"class":1260},[1053,18888,1168],{"class":1096},[1053,18890,6291],{"class":1260},[1053,18892,1269],{"class":1096},[1053,18894,18895],{"class":1055,"line":2672},[1053,18896,5052],{"class":1070},[1053,18898,18899,18901,18903,18905,18907],{"class":1055,"line":2680},[1053,18900,2511],{"class":1066},[1053,18902,7984],{"class":1265},[1053,18904,2171],{"class":1066},[1053,18906,7181],{"class":1070},[1053,18908,1135],{"class":1096},[1053,18910,18911,18913,18915,18917,18919,18921,18924,18926,18928,18930,18932],{"class":1055,"line":2685},[1053,18912,7116],{"class":1070},[1053,18914,1191],{"class":1096},[1053,18916,7192],{"class":1260},[1053,18918,1168],{"class":1096},[1053,18920,3879],{"class":1127},[1053,18922,18923],{"class":1485},"\"Microservice error: ",[1053,18925,3886],{"class":3885},[1053,18927,7204],{"class":1260},[1053,18929,3907],{"class":3885},[1053,18931,5467],{"class":1485},[1053,18933,1269],{"class":1096},[1053,18935,18936,18938,18940,18942,18944,18946,18948],{"class":1055,"line":2704},[1053,18937,2502],{"class":1066},[1053,18939,1396],{"class":1187},[1053,18941,1191],{"class":1096},[1053,18943,8740],{"class":1260},[1053,18945,1168],{"class":1096},[1053,18947,6291],{"class":1260},[1053,18949,1269],{"class":1096},[1053,18951,18952],{"class":1055,"line":2714},[1053,18953,1155],{"class":1070},[1053,18955,18956,18958,18960,18962,18964,18966,18968],{"class":1055,"line":2741},[1053,18957,1161],{"class":1127},[1053,18959,9033],{"class":1302},[1053,18961,1168],{"class":1096},[1053,18963,1172],{"class":1171},[1053,18965,1097],{"class":1096},[1053,18967,6265],{"class":1177},[1053,18969,1181],{"class":1096},[1053,18971,18972,18974,18976],{"class":1055,"line":2756},[1053,18973,1315],{"class":1141},[1053,18975,9050],{"class":1145},[1053,18977,1149],{"class":1141},[1053,18979,18980,18982,18985,18987,18989,18991,18993],{"class":1055,"line":2761},[1053,18981,1393],{"class":1066},[1053,18983,18984],{"class":1265}," super",[1053,18986,8604],{"class":1096},[1053,18988,13754],{"class":1260},[1053,18990,1168],{"class":1096},[1053,18992,6291],{"class":1260},[1053,18994,1269],{"class":1096},[1053,18996,18997],{"class":1055,"line":2768},[1053,18998,1121],{"emptyLinePlaceholder":1120},[1053,19000,19001],{"class":1055,"line":2787},[1053,19002,19003],{"class":1059},"# Emergency rollback command\n",[1053,19005,19006,19008,19010,19012,19014,19016,19019,19021,19024,19026],{"class":1055,"line":2797},[1053,19007,1085],{"class":1066},[1053,19009,6067],{"class":1070},[1053,19011,1191],{"class":1096},[1053,19013,17855],{"class":1070},[1053,19015,1191],{"class":1096},[1053,19017,19018],{"class":1070},"management",[1053,19020,1191],{"class":1096},[1053,19022,19023],{"class":1070},"base ",[1053,19025,1067],{"class":1066},[1053,19027,19028],{"class":1070}," BaseCommand\n",[1053,19030,19031],{"class":1055,"line":2802},[1053,19032,1121],{"emptyLinePlaceholder":1120},[1053,19034,19035,19037,19040,19042,19045],{"class":1055,"line":2823},[1053,19036,1128],{"class":1127},[1053,19038,19039],{"class":1131}," Command",[1053,19041,1168],{"class":1096},[1053,19043,19044],{"class":12507},"BaseCommand",[1053,19046,1181],{"class":1096},[1053,19048,19049,19052,19054,19056,19059],{"class":1055,"line":2863},[1053,19050,19051],{"class":1164},"    help",[1053,19053,1198],{"class":1096},[1053,19055,1482],{"class":1481},[1053,19057,19058],{"class":1485},"Emergency rollback to monolith",[1053,19060,10435],{"class":1481},[1053,19062,19063],{"class":1055,"line":2875},[1053,19064,1155],{"class":1070},[1053,19066,19067,19069,19072,19074,19076,19078,19081,19084,19086,19088,19091],{"class":1055,"line":2895},[1053,19068,1161],{"class":1127},[1053,19070,19071],{"class":1302}," handle",[1053,19073,1168],{"class":1096},[1053,19075,1172],{"class":1171},[1053,19077,1097],{"class":1096},[1053,19079,19080],{"class":1492}," *",[1053,19082,19083],{"class":1177},"args",[1053,19085,1097],{"class":1096},[1053,19087,10391],{"class":1492},[1053,19089,19090],{"class":1177},"options",[1053,19092,1181],{"class":1096},[1053,19094,19095,19097,19100],{"class":1055,"line":2943},[1053,19096,1315],{"class":1141},[1053,19098,19099],{"class":1145},"Perform emergency rollback",[1053,19101,1149],{"class":1141},[1053,19103,19104,19107,19109,19111],{"class":1055,"line":2968},[1053,19105,19106],{"class":1070},"        feature_flags ",[1053,19108,1521],{"class":1096},[1053,19110,17882],{"class":1260},[1053,19112,1333],{"class":1096},[1053,19114,19115],{"class":1055,"line":2974},[1053,19116,1387],{"class":1070},[1053,19118,19119],{"class":1055,"line":2979},[1053,19120,19121],{"class":1059},"        # Disable all microservice flags\n",[1053,19123,19124,19127,19129],{"class":1055,"line":2987},[1053,19125,19126],{"class":1070},"        flags_to_disable ",[1053,19128,1521],{"class":1096},[1053,19130,16153],{"class":1096},[1053,19132,19133,19135,19137,19139],{"class":1055,"line":2996},[1053,19134,3542],{"class":1481},[1053,19136,17995],{"class":1485},[1053,19138,1489],{"class":1481},[1053,19140,2402],{"class":1096},[1053,19142,19143,19145,19147,19149],{"class":1055,"line":3003},[1053,19144,3542],{"class":1481},[1053,19146,18010],{"class":1485},[1053,19148,1489],{"class":1481},[1053,19150,2402],{"class":1096},[1053,19152,19153,19155,19157],{"class":1055,"line":3008},[1053,19154,3542],{"class":1481},[1053,19156,18025],{"class":1485},[1053,19158,10435],{"class":1481},[1053,19160,19161],{"class":1055,"line":3026},[1053,19162,19163],{"class":1096},"        ]\n",[1053,19165,19166],{"class":1055,"line":3036},[1053,19167,1387],{"class":1070},[1053,19169,19170,19172,19175,19177,19180],{"class":1055,"line":3048},[1053,19171,1438],{"class":1066},[1053,19173,19174],{"class":1070}," flag ",[1053,19176,1454],{"class":1066},[1053,19178,19179],{"class":1070}," flags_to_disable",[1053,19181,1135],{"class":1096},[1053,19183,19184,19187,19189,19192,19194,19197,19199,19201],{"class":1055,"line":3070},[1053,19185,19186],{"class":1070},"            feature_flags",[1053,19188,1191],{"class":1096},[1053,19190,19191],{"class":1260},"set_flag",[1053,19193,1168],{"class":1096},[1053,19195,19196],{"class":1260},"flag",[1053,19198,1097],{"class":1096},[1053,19200,8682],{"class":5768},[1053,19202,1269],{"class":1096},[1053,19204,19205,19207,19209,19212,19214,19217,19219,19221,19224,19226,19228,19230,19232],{"class":1055,"line":3134},[1053,19206,4417],{"class":1187},[1053,19208,1191],{"class":1096},[1053,19210,19211],{"class":1194},"stdout",[1053,19213,1191],{"class":1096},[1053,19215,19216],{"class":1260},"write",[1053,19218,1168],{"class":1096},[1053,19220,3879],{"class":1127},[1053,19222,19223],{"class":1485},"\"Disabled ",[1053,19225,3886],{"class":3885},[1053,19227,19196],{"class":1260},[1053,19229,3907],{"class":3885},[1053,19231,5467],{"class":1485},[1053,19233,1269],{"class":1096},[1053,19235,19236],{"class":1055,"line":3145},[1053,19237,1387],{"class":1070},[1053,19239,19240],{"class":1055,"line":3153},[1053,19241,19242],{"class":1059},"        # Clear relevant caches\n",[1053,19244,19245,19247,19249,19252],{"class":1055,"line":3158},[1053,19246,18223],{"class":1070},[1053,19248,1191],{"class":1096},[1053,19250,19251],{"class":1260},"clear",[1053,19253,1333],{"class":1096},[1053,19255,19256],{"class":1055,"line":3177},[1053,19257,1387],{"class":1070},[1053,19259,19260,19262,19264,19266,19268,19270],{"class":1055,"line":3187},[1053,19261,1188],{"class":1187},[1053,19263,1191],{"class":1096},[1053,19265,19211],{"class":1194},[1053,19267,1191],{"class":1096},[1053,19269,19216],{"class":1260},[1053,19271,5688],{"class":1096},[1053,19273,19274,19276,19278,19281,19283,19286,19288,19290,19293,19295],{"class":1055,"line":3200},[1053,19275,4417],{"class":1187},[1053,19277,1191],{"class":1096},[1053,19279,19280],{"class":1194},"style",[1053,19282,1191],{"class":1096},[1053,19284,19285],{"class":1260},"SUCCESS",[1053,19287,1168],{"class":1096},[1053,19289,1489],{"class":1481},[1053,19291,19292],{"class":1485},"Emergency rollback completed",[1053,19294,1489],{"class":1481},[1053,19296,1269],{"class":1096},[1053,19298,19299],{"class":1055,"line":3205},[1053,19300,8477],{"class":1096},[1030,19302,19304],{"id":19303},"summary","Summary",[1026,19306,19307],{},"Transforming a monolithic Django application to microservices requires careful planning and execution:",[1026,19309,19310],{},[19311,19312,19313],"strong",{},"Assessment Phase:",[19315,19316,19317,19321,19324],"ul",{},[19318,19319,19320],"li",{},"Analyze existing codebase structure",[19318,19322,19323],{},"Identify service boundaries using DDD",[19318,19325,19326],{},"Plan migration strategy and timeline",[1026,19328,19329],{},[19311,19330,19331],{},"Migration Strategies:",[19315,19333,19334,19337,19340],{},[19318,19335,19336],{},"Strangler Fig pattern for gradual replacement",[19318,19338,19339],{},"Database decomposition with dual writes",[19318,19341,19342],{},"Event-driven synchronization",[1026,19344,19345],{},[19311,19346,19347],{},"Data Consistency:",[19315,19349,19350,19353,19356],{},[19318,19351,19352],{},"Saga pattern for distributed transactions",[19318,19354,19355],{},"Event sourcing for audit trails",[19318,19357,19358],{},"Eventual consistency patterns",[1026,19360,19361],{},[19311,19362,19363],{},"Monitoring and Rollback:",[19315,19365,19366,19369,19372],{},[19318,19367,19368],{},"Migration progress tracking",[19318,19370,19371],{},"Feature flags for controlled rollout",[19318,19373,19374],{},"Emergency rollback procedures",[1026,19376,19377],{},[19311,19378,19379],{},"Key Success Factors:",[19315,19381,19382,19385,19388,19391,19394],{},[19318,19383,19384],{},"Start with least coupled components",[19318,19386,19387],{},"Maintain backward compatibility",[19318,19389,19390],{},"Implement comprehensive monitoring",[19318,19392,19393],{},"Plan for rollback scenarios",[19318,19395,19396],{},"Test thoroughly at each stage",[1026,19398,19399],{},"The migration from monolith to microservices is a journey, not a destination. Take it step by step, learn from each phase, and be prepared to adapt your strategy based on real-world feedback and operational experience.",[1026,19401,19402],{},"This completes our comprehensive guide to Django microservices, from understanding the fundamentals to successfully migrating from monolithic architectures.",[19280,19404,19405],{},"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 .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 .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}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 .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 .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 .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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}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 .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .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 .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}",{"title":1048,"searchDepth":1056,"depth":1063,"links":19407},[19408,19412,19417,19420,19423,19426],{"id":1032,"depth":1063,"text":1033,"children":19409},[19410,19411],{"id":1037,"depth":1074,"text":1038},{"id":3934,"depth":1074,"text":3935},{"id":6042,"depth":1063,"text":6043,"children":19413},[19414,19415,19416],{"id":6046,"depth":1074,"text":6047},{"id":7597,"depth":1074,"text":7598},{"id":9780,"depth":1074,"text":9781},{"id":12405,"depth":1063,"text":12406,"children":19418},[19419],{"id":12409,"depth":1074,"text":12410},{"id":16480,"depth":1063,"text":16481,"children":19421},[19422],{"id":16484,"depth":1074,"text":16485},{"id":17815,"depth":1063,"text":17816,"children":19424},[19425],{"id":17819,"depth":1074,"text":17820},{"id":19303,"depth":1063,"text":19304},"md",null,{},{"title":925,"description":1028},"UGIt90isTD7U4r_jXLJQCgimBkEUEcbeCw68ihDINyY",[19433,19435],{"title":921,"path":922,"stem":923,"description":19434,"children":-1},"This section consolidates essential best practices for developing, deploying, and maintaining Django microservices. Following these practices ensures scalable, maintainable, and reliable microservices architecture.",{"title":934,"path":930,"stem":935,"description":19436,"children":-1},"Stay up-to-date with the latest Django releases, features, and improvements",1772474965816]