[{"data":1,"prerenderedAt":8241},["ShallowReactive",2],{"navigation":3,"/advanced-and-expert-topics":1016,"/advanced-and-expert-topics-surround":8236},[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":801,"body":1018,"description":1028,"extension":8231,"links":8232,"meta":8233,"navigation":1187,"path":802,"seo":8234,"stem":803,"__hash__":8235},"docs/22.advanced-and-expert-topics/01.index.md",{"type":1019,"value":1020,"toc":8210},"minimark",[1021,1025,1029,1034,1037,1042,1048,1064,1069,1083,1088,1102,1107,1121,1125,2281,2285,3290,3294,3298,4315,4319,4984,4988,4991,4996,5001,5006,5011,5016,5021,5026,5031,5036,5041,5046,5050,5054,6173,6177,6830,6834,6838,7561,7565,8190,8194,8197,8200,8203,8206],[1022,1023,801],"h1",{"id":1024},"advanced-and-expert-topics",[1026,1027,1028],"p",{},"This comprehensive guide explores advanced Django concepts and expert-level techniques for building enterprise-scale applications. These topics represent the pinnacle of Django development, covering system architecture patterns, domain-driven design, large-scale project organization, and advanced customization techniques that separate expert developers from intermediate practitioners.",[1030,1031,1033],"h2",{"id":1032},"mastering-advanced-django-development","Mastering Advanced Django Development",[1026,1035,1036],{},"Advanced Django development requires understanding not just the framework's features, but how to architect scalable systems, extend Django's core functionality, and build maintainable applications that can evolve with changing business requirements. This section covers the most sophisticated aspects of Django development.",[1038,1039,1041],"h3",{"id":1040},"expert-level-competencies","Expert-Level Competencies",[1026,1043,1044],{},[1045,1046,1047],"strong",{},"System Architecture Mastery",[1049,1050,1051,1055,1058,1061],"ul",{},[1052,1053,1054],"li",{},"Design scalable, maintainable system architectures",[1052,1056,1057],{},"Implement advanced design patterns in Django context",[1052,1059,1060],{},"Build loosely coupled, highly cohesive systems",[1052,1062,1063],{},"Architect for performance, scalability, and maintainability",[1026,1065,1066],{},[1045,1067,1068],{},"Domain-Driven Design Implementation",[1049,1070,1071,1074,1077,1080],{},[1052,1072,1073],{},"Apply DDD principles to Django applications",[1052,1075,1076],{},"Create rich domain models with business logic",[1052,1078,1079],{},"Implement bounded contexts and aggregates",[1052,1081,1082],{},"Design domain services and repositories",[1026,1084,1085],{},[1045,1086,1087],{},"Large-Scale Project Management",[1049,1089,1090,1093,1096,1099],{},[1052,1091,1092],{},"Organize complex Django projects effectively",[1052,1094,1095],{},"Implement modular architectures",[1052,1097,1098],{},"Manage dependencies and coupling",[1052,1100,1101],{},"Scale development teams and processes",[1026,1103,1104],{},[1045,1105,1106],{},"Framework Extension and Customization",[1049,1108,1109,1112,1115,1118],{},[1052,1110,1111],{},"Extend Django's core functionality",[1052,1113,1114],{},"Create custom ORM expressions and database functions",[1052,1116,1117],{},"Build sophisticated management commands",[1052,1119,1120],{},"Implement advanced signal patterns",[1038,1122,1124],{"id":1123},"advanced-architecture-patterns","Advanced Architecture Patterns",[1126,1127,1132],"pre",{"className":1128,"code":1129,"language":1130,"meta":1131,"style":1131},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Example: Hexagonal Architecture in Django\nfrom abc import ABC, abstractmethod\nfrom typing import Protocol\n\n# Domain Layer - Pure business logic\nclass Order:\n    \"\"\"Rich domain model with business logic\"\"\"\n    def __init__(self, customer_id: int, items: list):\n        self.customer_id = customer_id\n        self.items = items\n        self.status = 'pending'\n        self.total = self._calculate_total()\n    \n    def _calculate_total(self) -> Decimal:\n        \"\"\"Business logic for total calculation\"\"\"\n        subtotal = sum(item.price * item.quantity for item in self.items)\n        tax = subtotal * Decimal('0.08')  # 8% tax\n        return subtotal + tax\n    \n    def confirm(self):\n        \"\"\"Business rule: can only confirm pending orders\"\"\"\n        if self.status != 'pending':\n            raise ValueError(\"Can only confirm pending orders\")\n        self.status = 'confirmed'\n    \n    def can_be_cancelled(self) -> bool:\n        \"\"\"Business rule for cancellation\"\"\"\n        return self.status in ['pending', 'confirmed']\n\n# Application Layer - Use cases and orchestration\nclass OrderService:\n    \"\"\"Application service orchestrating domain operations\"\"\"\n    \n    def __init__(self, order_repo: 'OrderRepository', \n                 payment_service: 'PaymentService',\n                 notification_service: 'NotificationService'):\n        self.order_repo = order_repo\n        self.payment_service = payment_service\n        self.notification_service = notification_service\n    \n    def place_order(self, customer_id: int, items: list) -> Order:\n        \"\"\"Use case: Place a new order\"\"\"\n        # Create domain object\n        order = Order(customer_id, items)\n        \n        # Validate business rules\n        if not items:\n            raise ValueError(\"Order must have items\")\n        \n        # Persist through repository\n        saved_order = self.order_repo.save(order)\n        \n        # Trigger side effects\n        self.notification_service.send_order_confirmation(saved_order)\n        \n        return saved_order\n\n# Infrastructure Layer - External concerns\nclass DjangoOrderRepository:\n    \"\"\"Django ORM implementation of order repository\"\"\"\n    \n    def save(self, order: Order) -> Order:\n        \"\"\"Save order using Django ORM\"\"\"\n        django_order = OrderModel.objects.create(\n            customer_id=order.customer_id,\n            status=order.status,\n            total=order.total\n        )\n        \n        # Save order items\n        for item in order.items:\n            OrderItemModel.objects.create(\n                order=django_order,\n                product_id=item.product_id,\n                quantity=item.quantity,\n                price=item.price\n            )\n        \n        return self._to_domain_object(django_order)\n","python","",[1133,1134,1135,1144,1169,1182,1189,1195,1209,1223,1266,1285,1300,1323,1347,1353,1377,1388,1440,1471,1485,1490,1504,1514,1537,1558,1576,1581,1602,1612,1646,1651,1657,1667,1677,1682,1712,1730,1747,1762,1777,1792,1797,1833,1843,1849,1869,1875,1881,1893,1911,1916,1922,1948,1953,1959,1980,1985,1993,1998,2004,2014,2024,2029,2058,2068,2092,2109,2125,2140,2146,2151,2157,2175,2191,2204,2221,2237,2252,2258,2263],"code",{"__ignoreMap":1131},[1136,1137,1140],"span",{"class":1138,"line":1139},"line",1,[1136,1141,1143],{"class":1142},"s9Tkl","# Example: Hexagonal Architecture in Django\n",[1136,1145,1147,1151,1155,1158,1162,1166],{"class":1138,"line":1146},2,[1136,1148,1150],{"class":1149},"siDh9","from",[1136,1152,1154],{"class":1153},"sftqT"," abc ",[1136,1156,1157],{"class":1149},"import",[1136,1159,1161],{"class":1160},"se3Ec"," ABC",[1136,1163,1165],{"class":1164},"soVBu",",",[1136,1167,1168],{"class":1153}," abstractmethod\n",[1136,1170,1172,1174,1177,1179],{"class":1138,"line":1171},3,[1136,1173,1150],{"class":1149},[1136,1175,1176],{"class":1153}," typing ",[1136,1178,1157],{"class":1149},[1136,1180,1181],{"class":1153}," Protocol\n",[1136,1183,1185],{"class":1138,"line":1184},4,[1136,1186,1188],{"emptyLinePlaceholder":1187},true,"\n",[1136,1190,1192],{"class":1138,"line":1191},5,[1136,1193,1194],{"class":1142},"# Domain Layer - Pure business logic\n",[1136,1196,1198,1202,1206],{"class":1138,"line":1197},6,[1136,1199,1201],{"class":1200},"s5Kfy","class",[1136,1203,1205],{"class":1204},"sD-vU"," Order",[1136,1207,1208],{"class":1164},":\n",[1136,1210,1212,1216,1220],{"class":1138,"line":1211},7,[1136,1213,1215],{"class":1214},"sm7ve","    \"\"\"",[1136,1217,1219],{"class":1218},"sVyVU","Rich domain model with business logic",[1136,1221,1222],{"class":1214},"\"\"\"\n",[1136,1224,1226,1229,1233,1236,1240,1242,1246,1249,1253,1255,1258,1260,1263],{"class":1138,"line":1225},8,[1136,1227,1228],{"class":1200},"    def",[1136,1230,1232],{"class":1231},"sJdAF"," __init__",[1136,1234,1235],{"class":1164},"(",[1136,1237,1239],{"class":1238},"sRjD_","self",[1136,1241,1165],{"class":1164},[1136,1243,1245],{"class":1244},"sCyAa"," customer_id",[1136,1247,1248],{"class":1164},":",[1136,1250,1252],{"class":1251},"sa2tF"," int",[1136,1254,1165],{"class":1164},[1136,1256,1257],{"class":1244}," items",[1136,1259,1248],{"class":1164},[1136,1261,1262],{"class":1251}," list",[1136,1264,1265],{"class":1164},"):\n",[1136,1267,1269,1272,1275,1279,1282],{"class":1138,"line":1268},9,[1136,1270,1271],{"class":1160},"        self",[1136,1273,1274],{"class":1164},".",[1136,1276,1278],{"class":1277},"sBPpx","customer_id",[1136,1280,1281],{"class":1164}," =",[1136,1283,1284],{"class":1153}," customer_id\n",[1136,1286,1288,1290,1292,1295,1297],{"class":1138,"line":1287},10,[1136,1289,1271],{"class":1160},[1136,1291,1274],{"class":1164},[1136,1293,1294],{"class":1277},"items",[1136,1296,1281],{"class":1164},[1136,1298,1299],{"class":1153}," items\n",[1136,1301,1303,1305,1307,1310,1312,1316,1320],{"class":1138,"line":1302},11,[1136,1304,1271],{"class":1160},[1136,1306,1274],{"class":1164},[1136,1308,1309],{"class":1277},"status",[1136,1311,1281],{"class":1164},[1136,1313,1315],{"class":1314},"sbYkP"," '",[1136,1317,1319],{"class":1318},"sTbE_","pending",[1136,1321,1322],{"class":1314},"'\n",[1136,1324,1326,1328,1330,1333,1335,1338,1340,1344],{"class":1138,"line":1325},12,[1136,1327,1271],{"class":1160},[1136,1329,1274],{"class":1164},[1136,1331,1332],{"class":1277},"total",[1136,1334,1281],{"class":1164},[1136,1336,1337],{"class":1160}," self",[1136,1339,1274],{"class":1164},[1136,1341,1343],{"class":1342},"siWMO","_calculate_total",[1136,1345,1346],{"class":1164},"()\n",[1136,1348,1350],{"class":1138,"line":1349},13,[1136,1351,1352],{"class":1153},"    \n",[1136,1354,1356,1358,1362,1364,1366,1369,1372,1375],{"class":1138,"line":1355},14,[1136,1357,1228],{"class":1200},[1136,1359,1361],{"class":1360},"sljsM"," _calculate_total",[1136,1363,1235],{"class":1164},[1136,1365,1239],{"class":1238},[1136,1367,1368],{"class":1164},")",[1136,1370,1371],{"class":1164}," ->",[1136,1373,1374],{"class":1153}," Decimal",[1136,1376,1208],{"class":1164},[1136,1378,1380,1383,1386],{"class":1138,"line":1379},15,[1136,1381,1382],{"class":1214},"        \"\"\"",[1136,1384,1385],{"class":1218},"Business logic for total calculation",[1136,1387,1222],{"class":1214},[1136,1389,1391,1394,1397,1400,1402,1405,1407,1410,1414,1417,1419,1422,1425,1428,1431,1433,1435,1437],{"class":1138,"line":1390},16,[1136,1392,1393],{"class":1153},"        subtotal ",[1136,1395,1396],{"class":1164},"=",[1136,1398,1399],{"class":1231}," sum",[1136,1401,1235],{"class":1164},[1136,1403,1404],{"class":1342},"item",[1136,1406,1274],{"class":1164},[1136,1408,1409],{"class":1277},"price",[1136,1411,1413],{"class":1412},"sVsLi"," *",[1136,1415,1416],{"class":1342}," item",[1136,1418,1274],{"class":1164},[1136,1420,1421],{"class":1277},"quantity",[1136,1423,1424],{"class":1149}," for",[1136,1426,1427],{"class":1342}," item ",[1136,1429,1430],{"class":1149},"in",[1136,1432,1337],{"class":1160},[1136,1434,1274],{"class":1164},[1136,1436,1294],{"class":1277},[1136,1438,1439],{"class":1164},")\n",[1136,1441,1443,1446,1448,1451,1454,1456,1458,1461,1464,1466,1468],{"class":1138,"line":1442},17,[1136,1444,1445],{"class":1153},"        tax ",[1136,1447,1396],{"class":1164},[1136,1449,1450],{"class":1153}," subtotal ",[1136,1452,1453],{"class":1412},"*",[1136,1455,1374],{"class":1342},[1136,1457,1235],{"class":1164},[1136,1459,1460],{"class":1314},"'",[1136,1462,1463],{"class":1318},"0.08",[1136,1465,1460],{"class":1314},[1136,1467,1368],{"class":1164},[1136,1469,1470],{"class":1142},"  # 8% tax\n",[1136,1472,1474,1477,1479,1482],{"class":1138,"line":1473},18,[1136,1475,1476],{"class":1149},"        return",[1136,1478,1450],{"class":1153},[1136,1480,1481],{"class":1412},"+",[1136,1483,1484],{"class":1153}," tax\n",[1136,1486,1488],{"class":1138,"line":1487},19,[1136,1489,1352],{"class":1153},[1136,1491,1493,1495,1498,1500,1502],{"class":1138,"line":1492},20,[1136,1494,1228],{"class":1200},[1136,1496,1497],{"class":1360}," confirm",[1136,1499,1235],{"class":1164},[1136,1501,1239],{"class":1238},[1136,1503,1265],{"class":1164},[1136,1505,1507,1509,1512],{"class":1138,"line":1506},21,[1136,1508,1382],{"class":1214},[1136,1510,1511],{"class":1218},"Business rule: can only confirm pending orders",[1136,1513,1222],{"class":1214},[1136,1515,1517,1520,1522,1524,1526,1529,1531,1533,1535],{"class":1138,"line":1516},22,[1136,1518,1519],{"class":1149},"        if",[1136,1521,1337],{"class":1160},[1136,1523,1274],{"class":1164},[1136,1525,1309],{"class":1277},[1136,1527,1528],{"class":1412}," !=",[1136,1530,1315],{"class":1314},[1136,1532,1319],{"class":1318},[1136,1534,1460],{"class":1314},[1136,1536,1208],{"class":1164},[1136,1538,1540,1543,1546,1548,1551,1554,1556],{"class":1138,"line":1539},23,[1136,1541,1542],{"class":1149},"            raise",[1136,1544,1545],{"class":1251}," ValueError",[1136,1547,1235],{"class":1164},[1136,1549,1550],{"class":1314},"\"",[1136,1552,1553],{"class":1318},"Can only confirm pending orders",[1136,1555,1550],{"class":1314},[1136,1557,1439],{"class":1164},[1136,1559,1561,1563,1565,1567,1569,1571,1574],{"class":1138,"line":1560},24,[1136,1562,1271],{"class":1160},[1136,1564,1274],{"class":1164},[1136,1566,1309],{"class":1277},[1136,1568,1281],{"class":1164},[1136,1570,1315],{"class":1314},[1136,1572,1573],{"class":1318},"confirmed",[1136,1575,1322],{"class":1314},[1136,1577,1579],{"class":1138,"line":1578},25,[1136,1580,1352],{"class":1153},[1136,1582,1584,1586,1589,1591,1593,1595,1597,1600],{"class":1138,"line":1583},26,[1136,1585,1228],{"class":1200},[1136,1587,1588],{"class":1360}," can_be_cancelled",[1136,1590,1235],{"class":1164},[1136,1592,1239],{"class":1238},[1136,1594,1368],{"class":1164},[1136,1596,1371],{"class":1164},[1136,1598,1599],{"class":1251}," bool",[1136,1601,1208],{"class":1164},[1136,1603,1605,1607,1610],{"class":1138,"line":1604},27,[1136,1606,1382],{"class":1214},[1136,1608,1609],{"class":1218},"Business rule for cancellation",[1136,1611,1222],{"class":1214},[1136,1613,1615,1617,1619,1621,1623,1626,1629,1631,1633,1635,1637,1639,1641,1643],{"class":1138,"line":1614},28,[1136,1616,1476],{"class":1149},[1136,1618,1337],{"class":1160},[1136,1620,1274],{"class":1164},[1136,1622,1309],{"class":1277},[1136,1624,1625],{"class":1412}," in",[1136,1627,1628],{"class":1164}," [",[1136,1630,1460],{"class":1314},[1136,1632,1319],{"class":1318},[1136,1634,1460],{"class":1314},[1136,1636,1165],{"class":1164},[1136,1638,1315],{"class":1314},[1136,1640,1573],{"class":1318},[1136,1642,1460],{"class":1314},[1136,1644,1645],{"class":1164},"]\n",[1136,1647,1649],{"class":1138,"line":1648},29,[1136,1650,1188],{"emptyLinePlaceholder":1187},[1136,1652,1654],{"class":1138,"line":1653},30,[1136,1655,1656],{"class":1142},"# Application Layer - Use cases and orchestration\n",[1136,1658,1660,1662,1665],{"class":1138,"line":1659},31,[1136,1661,1201],{"class":1200},[1136,1663,1664],{"class":1204}," OrderService",[1136,1666,1208],{"class":1164},[1136,1668,1670,1672,1675],{"class":1138,"line":1669},32,[1136,1671,1215],{"class":1214},[1136,1673,1674],{"class":1218},"Application service orchestrating domain operations",[1136,1676,1222],{"class":1214},[1136,1678,1680],{"class":1138,"line":1679},33,[1136,1681,1352],{"class":1153},[1136,1683,1685,1687,1689,1691,1693,1695,1698,1700,1702,1705,1707,1709],{"class":1138,"line":1684},34,[1136,1686,1228],{"class":1200},[1136,1688,1232],{"class":1231},[1136,1690,1235],{"class":1164},[1136,1692,1239],{"class":1238},[1136,1694,1165],{"class":1164},[1136,1696,1697],{"class":1244}," order_repo",[1136,1699,1248],{"class":1164},[1136,1701,1315],{"class":1314},[1136,1703,1704],{"class":1318},"OrderRepository",[1136,1706,1460],{"class":1314},[1136,1708,1165],{"class":1164},[1136,1710,1711],{"class":1153}," \n",[1136,1713,1715,1718,1720,1722,1725,1727],{"class":1138,"line":1714},35,[1136,1716,1717],{"class":1244},"                 payment_service",[1136,1719,1248],{"class":1164},[1136,1721,1315],{"class":1314},[1136,1723,1724],{"class":1318},"PaymentService",[1136,1726,1460],{"class":1314},[1136,1728,1729],{"class":1164},",\n",[1136,1731,1733,1736,1738,1740,1743,1745],{"class":1138,"line":1732},36,[1136,1734,1735],{"class":1244},"                 notification_service",[1136,1737,1248],{"class":1164},[1136,1739,1315],{"class":1314},[1136,1741,1742],{"class":1318},"NotificationService",[1136,1744,1460],{"class":1314},[1136,1746,1265],{"class":1164},[1136,1748,1750,1752,1754,1757,1759],{"class":1138,"line":1749},37,[1136,1751,1271],{"class":1160},[1136,1753,1274],{"class":1164},[1136,1755,1756],{"class":1277},"order_repo",[1136,1758,1281],{"class":1164},[1136,1760,1761],{"class":1153}," order_repo\n",[1136,1763,1765,1767,1769,1772,1774],{"class":1138,"line":1764},38,[1136,1766,1271],{"class":1160},[1136,1768,1274],{"class":1164},[1136,1770,1771],{"class":1277},"payment_service",[1136,1773,1281],{"class":1164},[1136,1775,1776],{"class":1153}," payment_service\n",[1136,1778,1780,1782,1784,1787,1789],{"class":1138,"line":1779},39,[1136,1781,1271],{"class":1160},[1136,1783,1274],{"class":1164},[1136,1785,1786],{"class":1277},"notification_service",[1136,1788,1281],{"class":1164},[1136,1790,1791],{"class":1153}," notification_service\n",[1136,1793,1795],{"class":1138,"line":1794},40,[1136,1796,1352],{"class":1153},[1136,1798,1800,1802,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831],{"class":1138,"line":1799},41,[1136,1801,1228],{"class":1200},[1136,1803,1804],{"class":1360}," place_order",[1136,1806,1235],{"class":1164},[1136,1808,1239],{"class":1238},[1136,1810,1165],{"class":1164},[1136,1812,1245],{"class":1244},[1136,1814,1248],{"class":1164},[1136,1816,1252],{"class":1251},[1136,1818,1165],{"class":1164},[1136,1820,1257],{"class":1244},[1136,1822,1248],{"class":1164},[1136,1824,1262],{"class":1251},[1136,1826,1368],{"class":1164},[1136,1828,1371],{"class":1164},[1136,1830,1205],{"class":1153},[1136,1832,1208],{"class":1164},[1136,1834,1836,1838,1841],{"class":1138,"line":1835},42,[1136,1837,1382],{"class":1214},[1136,1839,1840],{"class":1218},"Use case: Place a new order",[1136,1842,1222],{"class":1214},[1136,1844,1846],{"class":1138,"line":1845},43,[1136,1847,1848],{"class":1142},"        # Create domain object\n",[1136,1850,1852,1855,1857,1859,1861,1863,1865,1867],{"class":1138,"line":1851},44,[1136,1853,1854],{"class":1153},"        order ",[1136,1856,1396],{"class":1164},[1136,1858,1205],{"class":1342},[1136,1860,1235],{"class":1164},[1136,1862,1278],{"class":1342},[1136,1864,1165],{"class":1164},[1136,1866,1257],{"class":1342},[1136,1868,1439],{"class":1164},[1136,1870,1872],{"class":1138,"line":1871},45,[1136,1873,1874],{"class":1153},"        \n",[1136,1876,1878],{"class":1138,"line":1877},46,[1136,1879,1880],{"class":1142},"        # Validate business rules\n",[1136,1882,1884,1886,1889,1891],{"class":1138,"line":1883},47,[1136,1885,1519],{"class":1149},[1136,1887,1888],{"class":1412}," not",[1136,1890,1257],{"class":1153},[1136,1892,1208],{"class":1164},[1136,1894,1896,1898,1900,1902,1904,1907,1909],{"class":1138,"line":1895},48,[1136,1897,1542],{"class":1149},[1136,1899,1545],{"class":1251},[1136,1901,1235],{"class":1164},[1136,1903,1550],{"class":1314},[1136,1905,1906],{"class":1318},"Order must have items",[1136,1908,1550],{"class":1314},[1136,1910,1439],{"class":1164},[1136,1912,1914],{"class":1138,"line":1913},49,[1136,1915,1874],{"class":1153},[1136,1917,1919],{"class":1138,"line":1918},50,[1136,1920,1921],{"class":1142},"        # Persist through repository\n",[1136,1923,1925,1928,1930,1932,1934,1936,1938,1941,1943,1946],{"class":1138,"line":1924},51,[1136,1926,1927],{"class":1153},"        saved_order ",[1136,1929,1396],{"class":1164},[1136,1931,1337],{"class":1160},[1136,1933,1274],{"class":1164},[1136,1935,1756],{"class":1277},[1136,1937,1274],{"class":1164},[1136,1939,1940],{"class":1342},"save",[1136,1942,1235],{"class":1164},[1136,1944,1945],{"class":1342},"order",[1136,1947,1439],{"class":1164},[1136,1949,1951],{"class":1138,"line":1950},52,[1136,1952,1874],{"class":1153},[1136,1954,1956],{"class":1138,"line":1955},53,[1136,1957,1958],{"class":1142},"        # Trigger side effects\n",[1136,1960,1962,1964,1966,1968,1970,1973,1975,1978],{"class":1138,"line":1961},54,[1136,1963,1271],{"class":1160},[1136,1965,1274],{"class":1164},[1136,1967,1786],{"class":1277},[1136,1969,1274],{"class":1164},[1136,1971,1972],{"class":1342},"send_order_confirmation",[1136,1974,1235],{"class":1164},[1136,1976,1977],{"class":1342},"saved_order",[1136,1979,1439],{"class":1164},[1136,1981,1983],{"class":1138,"line":1982},55,[1136,1984,1874],{"class":1153},[1136,1986,1988,1990],{"class":1138,"line":1987},56,[1136,1989,1476],{"class":1149},[1136,1991,1992],{"class":1153}," saved_order\n",[1136,1994,1996],{"class":1138,"line":1995},57,[1136,1997,1188],{"emptyLinePlaceholder":1187},[1136,1999,2001],{"class":1138,"line":2000},58,[1136,2002,2003],{"class":1142},"# Infrastructure Layer - External concerns\n",[1136,2005,2007,2009,2012],{"class":1138,"line":2006},59,[1136,2008,1201],{"class":1200},[1136,2010,2011],{"class":1204}," DjangoOrderRepository",[1136,2013,1208],{"class":1164},[1136,2015,2017,2019,2022],{"class":1138,"line":2016},60,[1136,2018,1215],{"class":1214},[1136,2020,2021],{"class":1218},"Django ORM implementation of order repository",[1136,2023,1222],{"class":1214},[1136,2025,2027],{"class":1138,"line":2026},61,[1136,2028,1352],{"class":1153},[1136,2030,2032,2034,2037,2039,2041,2043,2046,2048,2050,2052,2054,2056],{"class":1138,"line":2031},62,[1136,2033,1228],{"class":1200},[1136,2035,2036],{"class":1360}," save",[1136,2038,1235],{"class":1164},[1136,2040,1239],{"class":1238},[1136,2042,1165],{"class":1164},[1136,2044,2045],{"class":1244}," order",[1136,2047,1248],{"class":1164},[1136,2049,1205],{"class":1153},[1136,2051,1368],{"class":1164},[1136,2053,1371],{"class":1164},[1136,2055,1205],{"class":1153},[1136,2057,1208],{"class":1164},[1136,2059,2061,2063,2066],{"class":1138,"line":2060},63,[1136,2062,1382],{"class":1214},[1136,2064,2065],{"class":1218},"Save order using Django ORM",[1136,2067,1222],{"class":1214},[1136,2069,2071,2074,2076,2079,2081,2084,2086,2089],{"class":1138,"line":2070},64,[1136,2072,2073],{"class":1153},"        django_order ",[1136,2075,1396],{"class":1164},[1136,2077,2078],{"class":1153}," OrderModel",[1136,2080,1274],{"class":1164},[1136,2082,2083],{"class":1277},"objects",[1136,2085,1274],{"class":1164},[1136,2087,2088],{"class":1342},"create",[1136,2090,2091],{"class":1164},"(\n",[1136,2093,2095,2099,2101,2103,2105,2107],{"class":1138,"line":2094},65,[1136,2096,2098],{"class":2097},"sqOPj","            customer_id",[1136,2100,1396],{"class":1164},[1136,2102,1945],{"class":1342},[1136,2104,1274],{"class":1164},[1136,2106,1278],{"class":1277},[1136,2108,1729],{"class":1164},[1136,2110,2112,2115,2117,2119,2121,2123],{"class":1138,"line":2111},66,[1136,2113,2114],{"class":2097},"            status",[1136,2116,1396],{"class":1164},[1136,2118,1945],{"class":1342},[1136,2120,1274],{"class":1164},[1136,2122,1309],{"class":1277},[1136,2124,1729],{"class":1164},[1136,2126,2128,2131,2133,2135,2137],{"class":1138,"line":2127},67,[1136,2129,2130],{"class":2097},"            total",[1136,2132,1396],{"class":1164},[1136,2134,1945],{"class":1342},[1136,2136,1274],{"class":1164},[1136,2138,2139],{"class":1277},"total\n",[1136,2141,2143],{"class":1138,"line":2142},68,[1136,2144,2145],{"class":1164},"        )\n",[1136,2147,2149],{"class":1138,"line":2148},69,[1136,2150,1874],{"class":1153},[1136,2152,2154],{"class":1138,"line":2153},70,[1136,2155,2156],{"class":1142},"        # Save order items\n",[1136,2158,2160,2163,2165,2167,2169,2171,2173],{"class":1138,"line":2159},71,[1136,2161,2162],{"class":1149},"        for",[1136,2164,1427],{"class":1153},[1136,2166,1430],{"class":1149},[1136,2168,2045],{"class":1153},[1136,2170,1274],{"class":1164},[1136,2172,1294],{"class":1277},[1136,2174,1208],{"class":1164},[1136,2176,2178,2181,2183,2185,2187,2189],{"class":1138,"line":2177},72,[1136,2179,2180],{"class":1153},"            OrderItemModel",[1136,2182,1274],{"class":1164},[1136,2184,2083],{"class":1277},[1136,2186,1274],{"class":1164},[1136,2188,2088],{"class":1342},[1136,2190,2091],{"class":1164},[1136,2192,2194,2197,2199,2202],{"class":1138,"line":2193},73,[1136,2195,2196],{"class":2097},"                order",[1136,2198,1396],{"class":1164},[1136,2200,2201],{"class":1342},"django_order",[1136,2203,1729],{"class":1164},[1136,2205,2207,2210,2212,2214,2216,2219],{"class":1138,"line":2206},74,[1136,2208,2209],{"class":2097},"                product_id",[1136,2211,1396],{"class":1164},[1136,2213,1404],{"class":1342},[1136,2215,1274],{"class":1164},[1136,2217,2218],{"class":1277},"product_id",[1136,2220,1729],{"class":1164},[1136,2222,2224,2227,2229,2231,2233,2235],{"class":1138,"line":2223},75,[1136,2225,2226],{"class":2097},"                quantity",[1136,2228,1396],{"class":1164},[1136,2230,1404],{"class":1342},[1136,2232,1274],{"class":1164},[1136,2234,1421],{"class":1277},[1136,2236,1729],{"class":1164},[1136,2238,2240,2243,2245,2247,2249],{"class":1138,"line":2239},76,[1136,2241,2242],{"class":2097},"                price",[1136,2244,1396],{"class":1164},[1136,2246,1404],{"class":1342},[1136,2248,1274],{"class":1164},[1136,2250,2251],{"class":1277},"price\n",[1136,2253,2255],{"class":1138,"line":2254},77,[1136,2256,2257],{"class":1164},"            )\n",[1136,2259,2261],{"class":1138,"line":2260},78,[1136,2262,1874],{"class":1153},[1136,2264,2266,2268,2270,2272,2275,2277,2279],{"class":1138,"line":2265},79,[1136,2267,1476],{"class":1149},[1136,2269,1337],{"class":1160},[1136,2271,1274],{"class":1164},[1136,2273,2274],{"class":1342},"_to_domain_object",[1136,2276,1235],{"class":1164},[1136,2278,2201],{"class":1342},[1136,2280,1439],{"class":1164},[1038,2282,2284],{"id":2283},"advanced-design-patterns","Advanced Design Patterns",[1126,2286,2288],{"className":1128,"code":2287,"language":1130,"meta":1131,"style":1131},"# Strategy Pattern for Payment Processing\nclass PaymentStrategy(ABC):\n    \"\"\"Abstract payment strategy\"\"\"\n    \n    @abstractmethod\n    def process_payment(self, amount: Decimal, payment_data: dict) -> dict:\n        pass\n\nclass CreditCardPaymentStrategy(PaymentStrategy):\n    \"\"\"Credit card payment implementation\"\"\"\n    \n    def process_payment(self, amount: Decimal, payment_data: dict) -> dict:\n        # Credit card processing logic\n        return {\n            'success': True,\n            'transaction_id': 'cc_12345',\n            'amount': amount\n        }\n\nclass PayPalPaymentStrategy(PaymentStrategy):\n    \"\"\"PayPal payment implementation\"\"\"\n    \n    def process_payment(self, amount: Decimal, payment_data: dict) -> dict:\n        # PayPal processing logic\n        return {\n            'success': True,\n            'transaction_id': 'pp_67890',\n            'amount': amount\n        }\n\nclass PaymentProcessor:\n    \"\"\"Context class using strategy pattern\"\"\"\n    \n    def __init__(self, strategy: PaymentStrategy):\n        self.strategy = strategy\n    \n    def process(self, amount: Decimal, payment_data: dict) -> dict:\n        return self.strategy.process_payment(amount, payment_data)\n\n# Factory Pattern for Payment Strategy Creation\nclass PaymentStrategyFactory:\n    \"\"\"Factory for creating payment strategies\"\"\"\n    \n    _strategies = {\n        'credit_card': CreditCardPaymentStrategy,\n        'paypal': PayPalPaymentStrategy,\n    }\n    \n    @classmethod\n    def create_strategy(cls, payment_type: str) -> PaymentStrategy:\n        strategy_class = cls._strategies.get(payment_type)\n        if not strategy_class:\n            raise ValueError(f\"Unknown payment type: {payment_type}\")\n        return strategy_class()\n\n# Observer Pattern with Django Signals\nfrom django.dispatch import Signal, receiver\n\n# Custom signals\norder_placed = Signal()\npayment_processed = Signal()\n\nclass OrderEventHandler:\n    \"\"\"Event handler using observer pattern\"\"\"\n    \n    @staticmethod\n    @receiver(order_placed)\n    def handle_order_placed(sender, order, **kwargs):\n        \"\"\"Handle order placed event\"\"\"\n        # Send confirmation email\n        send_order_confirmation_email(order)\n        \n        # Update inventory\n        update_inventory_levels(order.items)\n        \n        # Log analytics event\n        track_order_event('order_placed', order)\n    \n    @staticmethod\n    @receiver(payment_processed)\n    def handle_payment_processed(sender, payment, **kwargs):\n        \"\"\"Handle payment processed event\"\"\"\n        # Update order status\n        payment.order.status = 'paid'\n        payment.order.save()\n        \n        # Trigger fulfillment\n        initiate_order_fulfillment(payment.order)\n",[1133,2289,2290,2295,2309,2318,2322,2330,2368,2373,2377,2392,2401,2405,2439,2444,2451,2469,2489,2503,2508,2512,2525,2534,2538,2572,2577,2583,2597,2616,2628,2632,2636,2645,2654,2658,2679,2693,2697,2732,2757,2761,2766,2775,2784,2788,2797,2813,2828,2833,2837,2844,2874,2901,2912,2939,2947,2951,2956,2978,2982,2987,2998,3009,3013,3022,3031,3035,3042,3056,3082,3091,3096,3107,3111,3116,3131,3135,3140,3159,3163,3169,3183,3208,3218,3224,3247,3262,3267,3273],{"__ignoreMap":1131},[1136,2291,2292],{"class":1138,"line":1139},[1136,2293,2294],{"class":1142},"# Strategy Pattern for Payment Processing\n",[1136,2296,2297,2299,2302,2304,2307],{"class":1138,"line":1146},[1136,2298,1201],{"class":1200},[1136,2300,2301],{"class":1204}," PaymentStrategy",[1136,2303,1235],{"class":1164},[1136,2305,2306],{"class":1160},"ABC",[1136,2308,1265],{"class":1164},[1136,2310,2311,2313,2316],{"class":1138,"line":1171},[1136,2312,1215],{"class":1214},[1136,2314,2315],{"class":1218},"Abstract payment strategy",[1136,2317,1222],{"class":1214},[1136,2319,2320],{"class":1138,"line":1184},[1136,2321,1352],{"class":1153},[1136,2323,2324,2327],{"class":1138,"line":1191},[1136,2325,2326],{"class":1164},"    @",[1136,2328,2329],{"class":1360},"abstractmethod\n",[1136,2331,2332,2334,2337,2339,2341,2343,2346,2348,2350,2352,2355,2357,2360,2362,2364,2366],{"class":1138,"line":1197},[1136,2333,1228],{"class":1200},[1136,2335,2336],{"class":1360}," process_payment",[1136,2338,1235],{"class":1164},[1136,2340,1239],{"class":1238},[1136,2342,1165],{"class":1164},[1136,2344,2345],{"class":1244}," amount",[1136,2347,1248],{"class":1164},[1136,2349,1374],{"class":1153},[1136,2351,1165],{"class":1164},[1136,2353,2354],{"class":1244}," payment_data",[1136,2356,1248],{"class":1164},[1136,2358,2359],{"class":1251}," dict",[1136,2361,1368],{"class":1164},[1136,2363,1371],{"class":1164},[1136,2365,2359],{"class":1251},[1136,2367,1208],{"class":1164},[1136,2369,2370],{"class":1138,"line":1211},[1136,2371,2372],{"class":1149},"        pass\n",[1136,2374,2375],{"class":1138,"line":1225},[1136,2376,1188],{"emptyLinePlaceholder":1187},[1136,2378,2379,2381,2384,2386,2390],{"class":1138,"line":1268},[1136,2380,1201],{"class":1200},[1136,2382,2383],{"class":1204}," CreditCardPaymentStrategy",[1136,2385,1235],{"class":1164},[1136,2387,2389],{"class":2388},"sYn-s","PaymentStrategy",[1136,2391,1265],{"class":1164},[1136,2393,2394,2396,2399],{"class":1138,"line":1287},[1136,2395,1215],{"class":1214},[1136,2397,2398],{"class":1218},"Credit card payment implementation",[1136,2400,1222],{"class":1214},[1136,2402,2403],{"class":1138,"line":1302},[1136,2404,1352],{"class":1153},[1136,2406,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437],{"class":1138,"line":1325},[1136,2408,1228],{"class":1200},[1136,2410,2336],{"class":1360},[1136,2412,1235],{"class":1164},[1136,2414,1239],{"class":1238},[1136,2416,1165],{"class":1164},[1136,2418,2345],{"class":1244},[1136,2420,1248],{"class":1164},[1136,2422,1374],{"class":1153},[1136,2424,1165],{"class":1164},[1136,2426,2354],{"class":1244},[1136,2428,1248],{"class":1164},[1136,2430,2359],{"class":1251},[1136,2432,1368],{"class":1164},[1136,2434,1371],{"class":1164},[1136,2436,2359],{"class":1251},[1136,2438,1208],{"class":1164},[1136,2440,2441],{"class":1138,"line":1349},[1136,2442,2443],{"class":1142},"        # Credit card processing logic\n",[1136,2445,2446,2448],{"class":1138,"line":1355},[1136,2447,1476],{"class":1149},[1136,2449,2450],{"class":1164}," {\n",[1136,2452,2453,2456,2459,2461,2463,2467],{"class":1138,"line":1379},[1136,2454,2455],{"class":1314},"            '",[1136,2457,2458],{"class":1318},"success",[1136,2460,1460],{"class":1314},[1136,2462,1248],{"class":1164},[1136,2464,2466],{"class":2465},"s8XtY"," True",[1136,2468,1729],{"class":1164},[1136,2470,2471,2473,2476,2478,2480,2482,2485,2487],{"class":1138,"line":1390},[1136,2472,2455],{"class":1314},[1136,2474,2475],{"class":1318},"transaction_id",[1136,2477,1460],{"class":1314},[1136,2479,1248],{"class":1164},[1136,2481,1315],{"class":1314},[1136,2483,2484],{"class":1318},"cc_12345",[1136,2486,1460],{"class":1314},[1136,2488,1729],{"class":1164},[1136,2490,2491,2493,2496,2498,2500],{"class":1138,"line":1442},[1136,2492,2455],{"class":1314},[1136,2494,2495],{"class":1318},"amount",[1136,2497,1460],{"class":1314},[1136,2499,1248],{"class":1164},[1136,2501,2502],{"class":1153}," amount\n",[1136,2504,2505],{"class":1138,"line":1473},[1136,2506,2507],{"class":1164},"        }\n",[1136,2509,2510],{"class":1138,"line":1487},[1136,2511,1188],{"emptyLinePlaceholder":1187},[1136,2513,2514,2516,2519,2521,2523],{"class":1138,"line":1492},[1136,2515,1201],{"class":1200},[1136,2517,2518],{"class":1204}," PayPalPaymentStrategy",[1136,2520,1235],{"class":1164},[1136,2522,2389],{"class":2388},[1136,2524,1265],{"class":1164},[1136,2526,2527,2529,2532],{"class":1138,"line":1506},[1136,2528,1215],{"class":1214},[1136,2530,2531],{"class":1218},"PayPal payment implementation",[1136,2533,1222],{"class":1214},[1136,2535,2536],{"class":1138,"line":1516},[1136,2537,1352],{"class":1153},[1136,2539,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570],{"class":1138,"line":1539},[1136,2541,1228],{"class":1200},[1136,2543,2336],{"class":1360},[1136,2545,1235],{"class":1164},[1136,2547,1239],{"class":1238},[1136,2549,1165],{"class":1164},[1136,2551,2345],{"class":1244},[1136,2553,1248],{"class":1164},[1136,2555,1374],{"class":1153},[1136,2557,1165],{"class":1164},[1136,2559,2354],{"class":1244},[1136,2561,1248],{"class":1164},[1136,2563,2359],{"class":1251},[1136,2565,1368],{"class":1164},[1136,2567,1371],{"class":1164},[1136,2569,2359],{"class":1251},[1136,2571,1208],{"class":1164},[1136,2573,2574],{"class":1138,"line":1560},[1136,2575,2576],{"class":1142},"        # PayPal processing logic\n",[1136,2578,2579,2581],{"class":1138,"line":1578},[1136,2580,1476],{"class":1149},[1136,2582,2450],{"class":1164},[1136,2584,2585,2587,2589,2591,2593,2595],{"class":1138,"line":1583},[1136,2586,2455],{"class":1314},[1136,2588,2458],{"class":1318},[1136,2590,1460],{"class":1314},[1136,2592,1248],{"class":1164},[1136,2594,2466],{"class":2465},[1136,2596,1729],{"class":1164},[1136,2598,2599,2601,2603,2605,2607,2609,2612,2614],{"class":1138,"line":1604},[1136,2600,2455],{"class":1314},[1136,2602,2475],{"class":1318},[1136,2604,1460],{"class":1314},[1136,2606,1248],{"class":1164},[1136,2608,1315],{"class":1314},[1136,2610,2611],{"class":1318},"pp_67890",[1136,2613,1460],{"class":1314},[1136,2615,1729],{"class":1164},[1136,2617,2618,2620,2622,2624,2626],{"class":1138,"line":1614},[1136,2619,2455],{"class":1314},[1136,2621,2495],{"class":1318},[1136,2623,1460],{"class":1314},[1136,2625,1248],{"class":1164},[1136,2627,2502],{"class":1153},[1136,2629,2630],{"class":1138,"line":1648},[1136,2631,2507],{"class":1164},[1136,2633,2634],{"class":1138,"line":1653},[1136,2635,1188],{"emptyLinePlaceholder":1187},[1136,2637,2638,2640,2643],{"class":1138,"line":1659},[1136,2639,1201],{"class":1200},[1136,2641,2642],{"class":1204}," PaymentProcessor",[1136,2644,1208],{"class":1164},[1136,2646,2647,2649,2652],{"class":1138,"line":1669},[1136,2648,1215],{"class":1214},[1136,2650,2651],{"class":1218},"Context class using strategy pattern",[1136,2653,1222],{"class":1214},[1136,2655,2656],{"class":1138,"line":1679},[1136,2657,1352],{"class":1153},[1136,2659,2660,2662,2664,2666,2668,2670,2673,2675,2677],{"class":1138,"line":1684},[1136,2661,1228],{"class":1200},[1136,2663,1232],{"class":1231},[1136,2665,1235],{"class":1164},[1136,2667,1239],{"class":1238},[1136,2669,1165],{"class":1164},[1136,2671,2672],{"class":1244}," strategy",[1136,2674,1248],{"class":1164},[1136,2676,2301],{"class":1153},[1136,2678,1265],{"class":1164},[1136,2680,2681,2683,2685,2688,2690],{"class":1138,"line":1714},[1136,2682,1271],{"class":1160},[1136,2684,1274],{"class":1164},[1136,2686,2687],{"class":1277},"strategy",[1136,2689,1281],{"class":1164},[1136,2691,2692],{"class":1153}," strategy\n",[1136,2694,2695],{"class":1138,"line":1732},[1136,2696,1352],{"class":1153},[1136,2698,2699,2701,2704,2706,2708,2710,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730],{"class":1138,"line":1749},[1136,2700,1228],{"class":1200},[1136,2702,2703],{"class":1360}," process",[1136,2705,1235],{"class":1164},[1136,2707,1239],{"class":1238},[1136,2709,1165],{"class":1164},[1136,2711,2345],{"class":1244},[1136,2713,1248],{"class":1164},[1136,2715,1374],{"class":1153},[1136,2717,1165],{"class":1164},[1136,2719,2354],{"class":1244},[1136,2721,1248],{"class":1164},[1136,2723,2359],{"class":1251},[1136,2725,1368],{"class":1164},[1136,2727,1371],{"class":1164},[1136,2729,2359],{"class":1251},[1136,2731,1208],{"class":1164},[1136,2733,2734,2736,2738,2740,2742,2744,2747,2749,2751,2753,2755],{"class":1138,"line":1764},[1136,2735,1476],{"class":1149},[1136,2737,1337],{"class":1160},[1136,2739,1274],{"class":1164},[1136,2741,2687],{"class":1277},[1136,2743,1274],{"class":1164},[1136,2745,2746],{"class":1342},"process_payment",[1136,2748,1235],{"class":1164},[1136,2750,2495],{"class":1342},[1136,2752,1165],{"class":1164},[1136,2754,2354],{"class":1342},[1136,2756,1439],{"class":1164},[1136,2758,2759],{"class":1138,"line":1779},[1136,2760,1188],{"emptyLinePlaceholder":1187},[1136,2762,2763],{"class":1138,"line":1794},[1136,2764,2765],{"class":1142},"# Factory Pattern for Payment Strategy Creation\n",[1136,2767,2768,2770,2773],{"class":1138,"line":1799},[1136,2769,1201],{"class":1200},[1136,2771,2772],{"class":1204}," PaymentStrategyFactory",[1136,2774,1208],{"class":1164},[1136,2776,2777,2779,2782],{"class":1138,"line":1835},[1136,2778,1215],{"class":1214},[1136,2780,2781],{"class":1218},"Factory for creating payment strategies",[1136,2783,1222],{"class":1214},[1136,2785,2786],{"class":1138,"line":1845},[1136,2787,1352],{"class":1153},[1136,2789,2790,2793,2795],{"class":1138,"line":1851},[1136,2791,2792],{"class":1153},"    _strategies ",[1136,2794,1396],{"class":1164},[1136,2796,2450],{"class":1164},[1136,2798,2799,2802,2805,2807,2809,2811],{"class":1138,"line":1871},[1136,2800,2801],{"class":1314},"        '",[1136,2803,2804],{"class":1318},"credit_card",[1136,2806,1460],{"class":1314},[1136,2808,1248],{"class":1164},[1136,2810,2383],{"class":1153},[1136,2812,1729],{"class":1164},[1136,2814,2815,2817,2820,2822,2824,2826],{"class":1138,"line":1877},[1136,2816,2801],{"class":1314},[1136,2818,2819],{"class":1318},"paypal",[1136,2821,1460],{"class":1314},[1136,2823,1248],{"class":1164},[1136,2825,2518],{"class":1153},[1136,2827,1729],{"class":1164},[1136,2829,2830],{"class":1138,"line":1883},[1136,2831,2832],{"class":1164},"    }\n",[1136,2834,2835],{"class":1138,"line":1895},[1136,2836,1352],{"class":1153},[1136,2838,2839,2841],{"class":1138,"line":1913},[1136,2840,2326],{"class":1164},[1136,2842,2843],{"class":1251},"classmethod\n",[1136,2845,2846,2848,2851,2853,2856,2858,2861,2863,2866,2868,2870,2872],{"class":1138,"line":1918},[1136,2847,1228],{"class":1200},[1136,2849,2850],{"class":1360}," create_strategy",[1136,2852,1235],{"class":1164},[1136,2854,2855],{"class":1244},"cls",[1136,2857,1165],{"class":1164},[1136,2859,2860],{"class":1244}," payment_type",[1136,2862,1248],{"class":1164},[1136,2864,2865],{"class":1251}," str",[1136,2867,1368],{"class":1164},[1136,2869,1371],{"class":1164},[1136,2871,2301],{"class":1153},[1136,2873,1208],{"class":1164},[1136,2875,2876,2879,2881,2884,2886,2889,2891,2894,2896,2899],{"class":1138,"line":1924},[1136,2877,2878],{"class":1153},"        strategy_class ",[1136,2880,1396],{"class":1164},[1136,2882,2883],{"class":1160}," cls",[1136,2885,1274],{"class":1164},[1136,2887,2888],{"class":1277},"_strategies",[1136,2890,1274],{"class":1164},[1136,2892,2893],{"class":1342},"get",[1136,2895,1235],{"class":1164},[1136,2897,2898],{"class":1342},"payment_type",[1136,2900,1439],{"class":1164},[1136,2902,2903,2905,2907,2910],{"class":1138,"line":1950},[1136,2904,1519],{"class":1149},[1136,2906,1888],{"class":1412},[1136,2908,2909],{"class":1153}," strategy_class",[1136,2911,1208],{"class":1164},[1136,2913,2914,2916,2918,2920,2923,2926,2930,2932,2935,2937],{"class":1138,"line":1955},[1136,2915,1542],{"class":1149},[1136,2917,1545],{"class":1251},[1136,2919,1235],{"class":1164},[1136,2921,2922],{"class":1200},"f",[1136,2924,2925],{"class":1318},"\"Unknown payment type: ",[1136,2927,2929],{"class":2928},"s3h35","{",[1136,2931,2898],{"class":1342},[1136,2933,2934],{"class":2928},"}",[1136,2936,1550],{"class":1318},[1136,2938,1439],{"class":1164},[1136,2940,2941,2943,2945],{"class":1138,"line":1961},[1136,2942,1476],{"class":1149},[1136,2944,2909],{"class":1342},[1136,2946,1346],{"class":1164},[1136,2948,2949],{"class":1138,"line":1982},[1136,2950,1188],{"emptyLinePlaceholder":1187},[1136,2952,2953],{"class":1138,"line":1987},[1136,2954,2955],{"class":1142},"# Observer Pattern with Django Signals\n",[1136,2957,2958,2960,2963,2965,2968,2970,2973,2975],{"class":1138,"line":1995},[1136,2959,1150],{"class":1149},[1136,2961,2962],{"class":1153}," django",[1136,2964,1274],{"class":1164},[1136,2966,2967],{"class":1153},"dispatch ",[1136,2969,1157],{"class":1149},[1136,2971,2972],{"class":1153}," Signal",[1136,2974,1165],{"class":1164},[1136,2976,2977],{"class":1153}," receiver\n",[1136,2979,2980],{"class":1138,"line":2000},[1136,2981,1188],{"emptyLinePlaceholder":1187},[1136,2983,2984],{"class":1138,"line":2006},[1136,2985,2986],{"class":1142},"# Custom signals\n",[1136,2988,2989,2992,2994,2996],{"class":1138,"line":2016},[1136,2990,2991],{"class":1153},"order_placed ",[1136,2993,1396],{"class":1164},[1136,2995,2972],{"class":1342},[1136,2997,1346],{"class":1164},[1136,2999,3000,3003,3005,3007],{"class":1138,"line":2026},[1136,3001,3002],{"class":1153},"payment_processed ",[1136,3004,1396],{"class":1164},[1136,3006,2972],{"class":1342},[1136,3008,1346],{"class":1164},[1136,3010,3011],{"class":1138,"line":2031},[1136,3012,1188],{"emptyLinePlaceholder":1187},[1136,3014,3015,3017,3020],{"class":1138,"line":2060},[1136,3016,1201],{"class":1200},[1136,3018,3019],{"class":1204}," OrderEventHandler",[1136,3021,1208],{"class":1164},[1136,3023,3024,3026,3029],{"class":1138,"line":2070},[1136,3025,1215],{"class":1214},[1136,3027,3028],{"class":1218},"Event handler using observer pattern",[1136,3030,1222],{"class":1214},[1136,3032,3033],{"class":1138,"line":2094},[1136,3034,1352],{"class":1153},[1136,3036,3037,3039],{"class":1138,"line":2111},[1136,3038,2326],{"class":1164},[1136,3040,3041],{"class":1251},"staticmethod\n",[1136,3043,3044,3046,3049,3051,3054],{"class":1138,"line":2127},[1136,3045,2326],{"class":1164},[1136,3047,3048],{"class":1360},"receiver",[1136,3050,1235],{"class":1164},[1136,3052,3053],{"class":1342},"order_placed",[1136,3055,1439],{"class":1164},[1136,3057,3058,3060,3063,3065,3068,3070,3072,3074,3077,3080],{"class":1138,"line":2142},[1136,3059,1228],{"class":1200},[1136,3061,3062],{"class":1360}," handle_order_placed",[1136,3064,1235],{"class":1164},[1136,3066,3067],{"class":1244},"sender",[1136,3069,1165],{"class":1164},[1136,3071,2045],{"class":1244},[1136,3073,1165],{"class":1164},[1136,3075,3076],{"class":1412}," **",[1136,3078,3079],{"class":1244},"kwargs",[1136,3081,1265],{"class":1164},[1136,3083,3084,3086,3089],{"class":1138,"line":2148},[1136,3085,1382],{"class":1214},[1136,3087,3088],{"class":1218},"Handle order placed event",[1136,3090,1222],{"class":1214},[1136,3092,3093],{"class":1138,"line":2153},[1136,3094,3095],{"class":1142},"        # Send confirmation email\n",[1136,3097,3098,3101,3103,3105],{"class":1138,"line":2159},[1136,3099,3100],{"class":1342},"        send_order_confirmation_email",[1136,3102,1235],{"class":1164},[1136,3104,1945],{"class":1342},[1136,3106,1439],{"class":1164},[1136,3108,3109],{"class":1138,"line":2177},[1136,3110,1874],{"class":1153},[1136,3112,3113],{"class":1138,"line":2193},[1136,3114,3115],{"class":1142},"        # Update inventory\n",[1136,3117,3118,3121,3123,3125,3127,3129],{"class":1138,"line":2206},[1136,3119,3120],{"class":1342},"        update_inventory_levels",[1136,3122,1235],{"class":1164},[1136,3124,1945],{"class":1342},[1136,3126,1274],{"class":1164},[1136,3128,1294],{"class":1277},[1136,3130,1439],{"class":1164},[1136,3132,3133],{"class":1138,"line":2223},[1136,3134,1874],{"class":1153},[1136,3136,3137],{"class":1138,"line":2239},[1136,3138,3139],{"class":1142},"        # Log analytics event\n",[1136,3141,3142,3145,3147,3149,3151,3153,3155,3157],{"class":1138,"line":2254},[1136,3143,3144],{"class":1342},"        track_order_event",[1136,3146,1235],{"class":1164},[1136,3148,1460],{"class":1314},[1136,3150,3053],{"class":1318},[1136,3152,1460],{"class":1314},[1136,3154,1165],{"class":1164},[1136,3156,2045],{"class":1342},[1136,3158,1439],{"class":1164},[1136,3160,3161],{"class":1138,"line":2260},[1136,3162,1352],{"class":1153},[1136,3164,3165,3167],{"class":1138,"line":2265},[1136,3166,2326],{"class":1164},[1136,3168,3041],{"class":1251},[1136,3170,3172,3174,3176,3178,3181],{"class":1138,"line":3171},80,[1136,3173,2326],{"class":1164},[1136,3175,3048],{"class":1360},[1136,3177,1235],{"class":1164},[1136,3179,3180],{"class":1342},"payment_processed",[1136,3182,1439],{"class":1164},[1136,3184,3186,3188,3191,3193,3195,3197,3200,3202,3204,3206],{"class":1138,"line":3185},81,[1136,3187,1228],{"class":1200},[1136,3189,3190],{"class":1360}," handle_payment_processed",[1136,3192,1235],{"class":1164},[1136,3194,3067],{"class":1244},[1136,3196,1165],{"class":1164},[1136,3198,3199],{"class":1244}," payment",[1136,3201,1165],{"class":1164},[1136,3203,3076],{"class":1412},[1136,3205,3079],{"class":1244},[1136,3207,1265],{"class":1164},[1136,3209,3211,3213,3216],{"class":1138,"line":3210},82,[1136,3212,1382],{"class":1214},[1136,3214,3215],{"class":1218},"Handle payment processed event",[1136,3217,1222],{"class":1214},[1136,3219,3221],{"class":1138,"line":3220},83,[1136,3222,3223],{"class":1142},"        # Update order status\n",[1136,3225,3227,3230,3232,3234,3236,3238,3240,3242,3245],{"class":1138,"line":3226},84,[1136,3228,3229],{"class":1153},"        payment",[1136,3231,1274],{"class":1164},[1136,3233,1945],{"class":1277},[1136,3235,1274],{"class":1164},[1136,3237,1309],{"class":1277},[1136,3239,1281],{"class":1164},[1136,3241,1315],{"class":1314},[1136,3243,3244],{"class":1318},"paid",[1136,3246,1322],{"class":1314},[1136,3248,3250,3252,3254,3256,3258,3260],{"class":1138,"line":3249},85,[1136,3251,3229],{"class":1153},[1136,3253,1274],{"class":1164},[1136,3255,1945],{"class":1277},[1136,3257,1274],{"class":1164},[1136,3259,1940],{"class":1342},[1136,3261,1346],{"class":1164},[1136,3263,3265],{"class":1138,"line":3264},86,[1136,3266,1874],{"class":1153},[1136,3268,3270],{"class":1138,"line":3269},87,[1136,3271,3272],{"class":1142},"        # Trigger fulfillment\n",[1136,3274,3276,3279,3281,3284,3286,3288],{"class":1138,"line":3275},88,[1136,3277,3278],{"class":1342},"        initiate_order_fulfillment",[1136,3280,1235],{"class":1164},[1136,3282,3283],{"class":1342},"payment",[1136,3285,1274],{"class":1164},[1136,3287,1945],{"class":1277},[1136,3289,1439],{"class":1164},[1030,3291,3293],{"id":3292},"enterprise-architecture-principles","Enterprise Architecture Principles",[1038,3295,3297],{"id":3296},"separation-of-concerns","Separation of Concerns",[1126,3299,3301],{"className":1128,"code":3300,"language":1130,"meta":1131,"style":1131},"# Clear separation between layers\nclass ProductController:\n    \"\"\"Presentation layer - handles HTTP concerns\"\"\"\n    \n    def __init__(self, product_service: ProductService):\n        self.product_service = product_service\n    \n    def create_product(self, request):\n        \"\"\"Handle HTTP request for product creation\"\"\"\n        try:\n            # Extract and validate input\n            data = self._validate_input(request.data)\n            \n            # Delegate to application service\n            product = self.product_service.create_product(data)\n            \n            # Return HTTP response\n            return JsonResponse({\n                'id': product.id,\n                'name': product.name,\n                'status': 'created'\n            }, status=201)\n            \n        except ValidationError as e:\n            return JsonResponse({'errors': e.messages}, status=400)\n        except BusinessRuleError as e:\n            return JsonResponse({'error': str(e)}, status=422)\n\nclass ProductService:\n    \"\"\"Application layer - orchestrates business operations\"\"\"\n    \n    def __init__(self, product_repo: ProductRepository,\n                 pricing_service: PricingService):\n        self.product_repo = product_repo\n        self.pricing_service = pricing_service\n    \n    def create_product(self, data: dict) -> Product:\n        \"\"\"Business use case for product creation\"\"\"\n        # Create domain object\n        product = Product(\n            name=data['name'],\n            description=data['description'],\n            category_id=data['category_id']\n        )\n        \n        # Apply business rules\n        if self.product_repo.exists_by_name(product.name):\n            raise BusinessRuleError(\"Product name must be unique\")\n        \n        # Calculate pricing\n        product.price = self.pricing_service.calculate_price(product)\n        \n        # Persist\n        return self.product_repo.save(product)\n\nclass Product:\n    \"\"\"Domain layer - pure business logic\"\"\"\n    \n    def __init__(self, name: str, description: str, category_id: int):\n        self.name = name\n        self.description = description\n        self.category_id = category_id\n        self.status = 'draft'\n        self.created_at = timezone.now()\n    \n    def publish(self):\n        \"\"\"Business rule for publishing\"\"\"\n        if not self.name or not self.description:\n            raise BusinessRuleError(\"Product must have name and description\")\n        \n        if self.price \u003C= 0:\n            raise BusinessRuleError(\"Product must have positive price\")\n        \n        self.status = 'published'\n    \n    def can_be_deleted(self) -> bool:\n        \"\"\"Business rule for deletion\"\"\"\n        return self.status == 'draft'\n",[1133,3302,3303,3308,3317,3326,3330,3352,3366,3370,3388,3397,3404,3409,3435,3440,3445,3469,3473,3478,3489,3510,3529,3546,3562,3566,3582,3619,3632,3668,3672,3680,3689,3693,3715,3727,3741,3755,3759,3787,3796,3800,3811,3832,3852,3872,3876,3880,3885,3911,3929,3933,3938,3966,3970,3975,3995,3999,4007,4016,4020,4059,4072,4085,4098,4115,4136,4140,4153,4162,4187,4204,4208,4226,4243,4247,4264,4268,4287,4296],{"__ignoreMap":1131},[1136,3304,3305],{"class":1138,"line":1139},[1136,3306,3307],{"class":1142},"# Clear separation between layers\n",[1136,3309,3310,3312,3315],{"class":1138,"line":1146},[1136,3311,1201],{"class":1200},[1136,3313,3314],{"class":1204}," ProductController",[1136,3316,1208],{"class":1164},[1136,3318,3319,3321,3324],{"class":1138,"line":1171},[1136,3320,1215],{"class":1214},[1136,3322,3323],{"class":1218},"Presentation layer - handles HTTP concerns",[1136,3325,1222],{"class":1214},[1136,3327,3328],{"class":1138,"line":1184},[1136,3329,1352],{"class":1153},[1136,3331,3332,3334,3336,3338,3340,3342,3345,3347,3350],{"class":1138,"line":1191},[1136,3333,1228],{"class":1200},[1136,3335,1232],{"class":1231},[1136,3337,1235],{"class":1164},[1136,3339,1239],{"class":1238},[1136,3341,1165],{"class":1164},[1136,3343,3344],{"class":1244}," product_service",[1136,3346,1248],{"class":1164},[1136,3348,3349],{"class":1153}," ProductService",[1136,3351,1265],{"class":1164},[1136,3353,3354,3356,3358,3361,3363],{"class":1138,"line":1197},[1136,3355,1271],{"class":1160},[1136,3357,1274],{"class":1164},[1136,3359,3360],{"class":1277},"product_service",[1136,3362,1281],{"class":1164},[1136,3364,3365],{"class":1153}," product_service\n",[1136,3367,3368],{"class":1138,"line":1211},[1136,3369,1352],{"class":1153},[1136,3371,3372,3374,3377,3379,3381,3383,3386],{"class":1138,"line":1225},[1136,3373,1228],{"class":1200},[1136,3375,3376],{"class":1360}," create_product",[1136,3378,1235],{"class":1164},[1136,3380,1239],{"class":1238},[1136,3382,1165],{"class":1164},[1136,3384,3385],{"class":1244}," request",[1136,3387,1265],{"class":1164},[1136,3389,3390,3392,3395],{"class":1138,"line":1268},[1136,3391,1382],{"class":1214},[1136,3393,3394],{"class":1218},"Handle HTTP request for product creation",[1136,3396,1222],{"class":1214},[1136,3398,3399,3402],{"class":1138,"line":1287},[1136,3400,3401],{"class":1149},"        try",[1136,3403,1208],{"class":1164},[1136,3405,3406],{"class":1138,"line":1302},[1136,3407,3408],{"class":1142},"            # Extract and validate input\n",[1136,3410,3411,3414,3416,3418,3420,3423,3425,3428,3430,3433],{"class":1138,"line":1325},[1136,3412,3413],{"class":1153},"            data ",[1136,3415,1396],{"class":1164},[1136,3417,1337],{"class":1160},[1136,3419,1274],{"class":1164},[1136,3421,3422],{"class":1342},"_validate_input",[1136,3424,1235],{"class":1164},[1136,3426,3427],{"class":1342},"request",[1136,3429,1274],{"class":1164},[1136,3431,3432],{"class":1277},"data",[1136,3434,1439],{"class":1164},[1136,3436,3437],{"class":1138,"line":1349},[1136,3438,3439],{"class":1153},"            \n",[1136,3441,3442],{"class":1138,"line":1355},[1136,3443,3444],{"class":1142},"            # Delegate to application service\n",[1136,3446,3447,3450,3452,3454,3456,3458,3460,3463,3465,3467],{"class":1138,"line":1379},[1136,3448,3449],{"class":1153},"            product ",[1136,3451,1396],{"class":1164},[1136,3453,1337],{"class":1160},[1136,3455,1274],{"class":1164},[1136,3457,3360],{"class":1277},[1136,3459,1274],{"class":1164},[1136,3461,3462],{"class":1342},"create_product",[1136,3464,1235],{"class":1164},[1136,3466,3432],{"class":1342},[1136,3468,1439],{"class":1164},[1136,3470,3471],{"class":1138,"line":1390},[1136,3472,3439],{"class":1153},[1136,3474,3475],{"class":1138,"line":1442},[1136,3476,3477],{"class":1142},"            # Return HTTP response\n",[1136,3479,3480,3483,3486],{"class":1138,"line":1473},[1136,3481,3482],{"class":1149},"            return",[1136,3484,3485],{"class":1342}," JsonResponse",[1136,3487,3488],{"class":1164},"({\n",[1136,3490,3491,3494,3497,3499,3501,3504,3506,3508],{"class":1138,"line":1487},[1136,3492,3493],{"class":1314},"                '",[1136,3495,3496],{"class":1318},"id",[1136,3498,1460],{"class":1314},[1136,3500,1248],{"class":1164},[1136,3502,3503],{"class":1342}," product",[1136,3505,1274],{"class":1164},[1136,3507,3496],{"class":1277},[1136,3509,1729],{"class":1164},[1136,3511,3512,3514,3517,3519,3521,3523,3525,3527],{"class":1138,"line":1492},[1136,3513,3493],{"class":1314},[1136,3515,3516],{"class":1318},"name",[1136,3518,1460],{"class":1314},[1136,3520,1248],{"class":1164},[1136,3522,3503],{"class":1342},[1136,3524,1274],{"class":1164},[1136,3526,3516],{"class":1277},[1136,3528,1729],{"class":1164},[1136,3530,3531,3533,3535,3537,3539,3541,3544],{"class":1138,"line":1506},[1136,3532,3493],{"class":1314},[1136,3534,1309],{"class":1318},[1136,3536,1460],{"class":1314},[1136,3538,1248],{"class":1164},[1136,3540,1315],{"class":1314},[1136,3542,3543],{"class":1318},"created",[1136,3545,1322],{"class":1314},[1136,3547,3548,3551,3554,3556,3560],{"class":1138,"line":1516},[1136,3549,3550],{"class":1164},"            },",[1136,3552,3553],{"class":2097}," status",[1136,3555,1396],{"class":1164},[1136,3557,3559],{"class":3558},"s7CZa","201",[1136,3561,1439],{"class":1164},[1136,3563,3564],{"class":1138,"line":1539},[1136,3565,3439],{"class":1153},[1136,3567,3568,3571,3574,3577,3580],{"class":1138,"line":1560},[1136,3569,3570],{"class":1149},"        except",[1136,3572,3573],{"class":1153}," ValidationError ",[1136,3575,3576],{"class":1149},"as",[1136,3578,3579],{"class":1153}," e",[1136,3581,1208],{"class":1164},[1136,3583,3584,3586,3588,3591,3593,3596,3598,3600,3602,3604,3607,3610,3612,3614,3617],{"class":1138,"line":1578},[1136,3585,3482],{"class":1149},[1136,3587,3485],{"class":1342},[1136,3589,3590],{"class":1164},"({",[1136,3592,1460],{"class":1314},[1136,3594,3595],{"class":1318},"errors",[1136,3597,1460],{"class":1314},[1136,3599,1248],{"class":1164},[1136,3601,3579],{"class":1342},[1136,3603,1274],{"class":1164},[1136,3605,3606],{"class":1277},"messages",[1136,3608,3609],{"class":1164},"},",[1136,3611,3553],{"class":2097},[1136,3613,1396],{"class":1164},[1136,3615,3616],{"class":3558},"400",[1136,3618,1439],{"class":1164},[1136,3620,3621,3623,3626,3628,3630],{"class":1138,"line":1583},[1136,3622,3570],{"class":1149},[1136,3624,3625],{"class":1153}," BusinessRuleError ",[1136,3627,3576],{"class":1149},[1136,3629,3579],{"class":1153},[1136,3631,1208],{"class":1164},[1136,3633,3634,3636,3638,3640,3642,3645,3647,3649,3651,3653,3656,3659,3661,3663,3666],{"class":1138,"line":1604},[1136,3635,3482],{"class":1149},[1136,3637,3485],{"class":1342},[1136,3639,3590],{"class":1164},[1136,3641,1460],{"class":1314},[1136,3643,3644],{"class":1318},"error",[1136,3646,1460],{"class":1314},[1136,3648,1248],{"class":1164},[1136,3650,2865],{"class":1251},[1136,3652,1235],{"class":1164},[1136,3654,3655],{"class":1342},"e",[1136,3657,3658],{"class":1164},")},",[1136,3660,3553],{"class":2097},[1136,3662,1396],{"class":1164},[1136,3664,3665],{"class":3558},"422",[1136,3667,1439],{"class":1164},[1136,3669,3670],{"class":1138,"line":1614},[1136,3671,1188],{"emptyLinePlaceholder":1187},[1136,3673,3674,3676,3678],{"class":1138,"line":1648},[1136,3675,1201],{"class":1200},[1136,3677,3349],{"class":1204},[1136,3679,1208],{"class":1164},[1136,3681,3682,3684,3687],{"class":1138,"line":1653},[1136,3683,1215],{"class":1214},[1136,3685,3686],{"class":1218},"Application layer - orchestrates business operations",[1136,3688,1222],{"class":1214},[1136,3690,3691],{"class":1138,"line":1659},[1136,3692,1352],{"class":1153},[1136,3694,3695,3697,3699,3701,3703,3705,3708,3710,3713],{"class":1138,"line":1669},[1136,3696,1228],{"class":1200},[1136,3698,1232],{"class":1231},[1136,3700,1235],{"class":1164},[1136,3702,1239],{"class":1238},[1136,3704,1165],{"class":1164},[1136,3706,3707],{"class":1244}," product_repo",[1136,3709,1248],{"class":1164},[1136,3711,3712],{"class":1153}," ProductRepository",[1136,3714,1729],{"class":1164},[1136,3716,3717,3720,3722,3725],{"class":1138,"line":1679},[1136,3718,3719],{"class":1244},"                 pricing_service",[1136,3721,1248],{"class":1164},[1136,3723,3724],{"class":1153}," PricingService",[1136,3726,1265],{"class":1164},[1136,3728,3729,3731,3733,3736,3738],{"class":1138,"line":1684},[1136,3730,1271],{"class":1160},[1136,3732,1274],{"class":1164},[1136,3734,3735],{"class":1277},"product_repo",[1136,3737,1281],{"class":1164},[1136,3739,3740],{"class":1153}," product_repo\n",[1136,3742,3743,3745,3747,3750,3752],{"class":1138,"line":1714},[1136,3744,1271],{"class":1160},[1136,3746,1274],{"class":1164},[1136,3748,3749],{"class":1277},"pricing_service",[1136,3751,1281],{"class":1164},[1136,3753,3754],{"class":1153}," pricing_service\n",[1136,3756,3757],{"class":1138,"line":1732},[1136,3758,1352],{"class":1153},[1136,3760,3761,3763,3765,3767,3769,3771,3774,3776,3778,3780,3782,3785],{"class":1138,"line":1749},[1136,3762,1228],{"class":1200},[1136,3764,3376],{"class":1360},[1136,3766,1235],{"class":1164},[1136,3768,1239],{"class":1238},[1136,3770,1165],{"class":1164},[1136,3772,3773],{"class":1244}," data",[1136,3775,1248],{"class":1164},[1136,3777,2359],{"class":1251},[1136,3779,1368],{"class":1164},[1136,3781,1371],{"class":1164},[1136,3783,3784],{"class":1153}," Product",[1136,3786,1208],{"class":1164},[1136,3788,3789,3791,3794],{"class":1138,"line":1764},[1136,3790,1382],{"class":1214},[1136,3792,3793],{"class":1218},"Business use case for product creation",[1136,3795,1222],{"class":1214},[1136,3797,3798],{"class":1138,"line":1779},[1136,3799,1848],{"class":1142},[1136,3801,3802,3805,3807,3809],{"class":1138,"line":1794},[1136,3803,3804],{"class":1153},"        product ",[1136,3806,1396],{"class":1164},[1136,3808,3784],{"class":1342},[1136,3810,2091],{"class":1164},[1136,3812,3813,3816,3818,3820,3823,3825,3827,3829],{"class":1138,"line":1799},[1136,3814,3815],{"class":2097},"            name",[1136,3817,1396],{"class":1164},[1136,3819,3432],{"class":1342},[1136,3821,3822],{"class":1164},"[",[1136,3824,1460],{"class":1314},[1136,3826,3516],{"class":1318},[1136,3828,1460],{"class":1314},[1136,3830,3831],{"class":1164},"],\n",[1136,3833,3834,3837,3839,3841,3843,3845,3848,3850],{"class":1138,"line":1835},[1136,3835,3836],{"class":2097},"            description",[1136,3838,1396],{"class":1164},[1136,3840,3432],{"class":1342},[1136,3842,3822],{"class":1164},[1136,3844,1460],{"class":1314},[1136,3846,3847],{"class":1318},"description",[1136,3849,1460],{"class":1314},[1136,3851,3831],{"class":1164},[1136,3853,3854,3857,3859,3861,3863,3865,3868,3870],{"class":1138,"line":1845},[1136,3855,3856],{"class":2097},"            category_id",[1136,3858,1396],{"class":1164},[1136,3860,3432],{"class":1342},[1136,3862,3822],{"class":1164},[1136,3864,1460],{"class":1314},[1136,3866,3867],{"class":1318},"category_id",[1136,3869,1460],{"class":1314},[1136,3871,1645],{"class":1164},[1136,3873,3874],{"class":1138,"line":1851},[1136,3875,2145],{"class":1164},[1136,3877,3878],{"class":1138,"line":1871},[1136,3879,1874],{"class":1153},[1136,3881,3882],{"class":1138,"line":1877},[1136,3883,3884],{"class":1142},"        # Apply business rules\n",[1136,3886,3887,3889,3891,3893,3895,3897,3900,3902,3905,3907,3909],{"class":1138,"line":1883},[1136,3888,1519],{"class":1149},[1136,3890,1337],{"class":1160},[1136,3892,1274],{"class":1164},[1136,3894,3735],{"class":1277},[1136,3896,1274],{"class":1164},[1136,3898,3899],{"class":1342},"exists_by_name",[1136,3901,1235],{"class":1164},[1136,3903,3904],{"class":1342},"product",[1136,3906,1274],{"class":1164},[1136,3908,3516],{"class":1277},[1136,3910,1265],{"class":1164},[1136,3912,3913,3915,3918,3920,3922,3925,3927],{"class":1138,"line":1895},[1136,3914,1542],{"class":1149},[1136,3916,3917],{"class":1342}," BusinessRuleError",[1136,3919,1235],{"class":1164},[1136,3921,1550],{"class":1314},[1136,3923,3924],{"class":1318},"Product name must be unique",[1136,3926,1550],{"class":1314},[1136,3928,1439],{"class":1164},[1136,3930,3931],{"class":1138,"line":1913},[1136,3932,1874],{"class":1153},[1136,3934,3935],{"class":1138,"line":1918},[1136,3936,3937],{"class":1142},"        # Calculate pricing\n",[1136,3939,3940,3943,3945,3947,3949,3951,3953,3955,3957,3960,3962,3964],{"class":1138,"line":1924},[1136,3941,3942],{"class":1153},"        product",[1136,3944,1274],{"class":1164},[1136,3946,1409],{"class":1277},[1136,3948,1281],{"class":1164},[1136,3950,1337],{"class":1160},[1136,3952,1274],{"class":1164},[1136,3954,3749],{"class":1277},[1136,3956,1274],{"class":1164},[1136,3958,3959],{"class":1342},"calculate_price",[1136,3961,1235],{"class":1164},[1136,3963,3904],{"class":1342},[1136,3965,1439],{"class":1164},[1136,3967,3968],{"class":1138,"line":1950},[1136,3969,1874],{"class":1153},[1136,3971,3972],{"class":1138,"line":1955},[1136,3973,3974],{"class":1142},"        # Persist\n",[1136,3976,3977,3979,3981,3983,3985,3987,3989,3991,3993],{"class":1138,"line":1961},[1136,3978,1476],{"class":1149},[1136,3980,1337],{"class":1160},[1136,3982,1274],{"class":1164},[1136,3984,3735],{"class":1277},[1136,3986,1274],{"class":1164},[1136,3988,1940],{"class":1342},[1136,3990,1235],{"class":1164},[1136,3992,3904],{"class":1342},[1136,3994,1439],{"class":1164},[1136,3996,3997],{"class":1138,"line":1982},[1136,3998,1188],{"emptyLinePlaceholder":1187},[1136,4000,4001,4003,4005],{"class":1138,"line":1987},[1136,4002,1201],{"class":1200},[1136,4004,3784],{"class":1204},[1136,4006,1208],{"class":1164},[1136,4008,4009,4011,4014],{"class":1138,"line":1995},[1136,4010,1215],{"class":1214},[1136,4012,4013],{"class":1218},"Domain layer - pure business logic",[1136,4015,1222],{"class":1214},[1136,4017,4018],{"class":1138,"line":2000},[1136,4019,1352],{"class":1153},[1136,4021,4022,4024,4026,4028,4030,4032,4035,4037,4039,4041,4044,4046,4048,4050,4053,4055,4057],{"class":1138,"line":2006},[1136,4023,1228],{"class":1200},[1136,4025,1232],{"class":1231},[1136,4027,1235],{"class":1164},[1136,4029,1239],{"class":1238},[1136,4031,1165],{"class":1164},[1136,4033,4034],{"class":1244}," name",[1136,4036,1248],{"class":1164},[1136,4038,2865],{"class":1251},[1136,4040,1165],{"class":1164},[1136,4042,4043],{"class":1244}," description",[1136,4045,1248],{"class":1164},[1136,4047,2865],{"class":1251},[1136,4049,1165],{"class":1164},[1136,4051,4052],{"class":1244}," category_id",[1136,4054,1248],{"class":1164},[1136,4056,1252],{"class":1251},[1136,4058,1265],{"class":1164},[1136,4060,4061,4063,4065,4067,4069],{"class":1138,"line":2016},[1136,4062,1271],{"class":1160},[1136,4064,1274],{"class":1164},[1136,4066,3516],{"class":1277},[1136,4068,1281],{"class":1164},[1136,4070,4071],{"class":1153}," name\n",[1136,4073,4074,4076,4078,4080,4082],{"class":1138,"line":2026},[1136,4075,1271],{"class":1160},[1136,4077,1274],{"class":1164},[1136,4079,3847],{"class":1277},[1136,4081,1281],{"class":1164},[1136,4083,4084],{"class":1153}," description\n",[1136,4086,4087,4089,4091,4093,4095],{"class":1138,"line":2031},[1136,4088,1271],{"class":1160},[1136,4090,1274],{"class":1164},[1136,4092,3867],{"class":1277},[1136,4094,1281],{"class":1164},[1136,4096,4097],{"class":1153}," category_id\n",[1136,4099,4100,4102,4104,4106,4108,4110,4113],{"class":1138,"line":2060},[1136,4101,1271],{"class":1160},[1136,4103,1274],{"class":1164},[1136,4105,1309],{"class":1277},[1136,4107,1281],{"class":1164},[1136,4109,1315],{"class":1314},[1136,4111,4112],{"class":1318},"draft",[1136,4114,1322],{"class":1314},[1136,4116,4117,4119,4121,4124,4126,4129,4131,4134],{"class":1138,"line":2070},[1136,4118,1271],{"class":1160},[1136,4120,1274],{"class":1164},[1136,4122,4123],{"class":1277},"created_at",[1136,4125,1281],{"class":1164},[1136,4127,4128],{"class":1153}," timezone",[1136,4130,1274],{"class":1164},[1136,4132,4133],{"class":1342},"now",[1136,4135,1346],{"class":1164},[1136,4137,4138],{"class":1138,"line":2094},[1136,4139,1352],{"class":1153},[1136,4141,4142,4144,4147,4149,4151],{"class":1138,"line":2111},[1136,4143,1228],{"class":1200},[1136,4145,4146],{"class":1360}," publish",[1136,4148,1235],{"class":1164},[1136,4150,1239],{"class":1238},[1136,4152,1265],{"class":1164},[1136,4154,4155,4157,4160],{"class":1138,"line":2127},[1136,4156,1382],{"class":1214},[1136,4158,4159],{"class":1218},"Business rule for publishing",[1136,4161,1222],{"class":1214},[1136,4163,4164,4166,4168,4170,4172,4174,4177,4179,4181,4183,4185],{"class":1138,"line":2142},[1136,4165,1519],{"class":1149},[1136,4167,1888],{"class":1412},[1136,4169,1337],{"class":1160},[1136,4171,1274],{"class":1164},[1136,4173,3516],{"class":1277},[1136,4175,4176],{"class":1412}," or",[1136,4178,1888],{"class":1412},[1136,4180,1337],{"class":1160},[1136,4182,1274],{"class":1164},[1136,4184,3847],{"class":1277},[1136,4186,1208],{"class":1164},[1136,4188,4189,4191,4193,4195,4197,4200,4202],{"class":1138,"line":2148},[1136,4190,1542],{"class":1149},[1136,4192,3917],{"class":1342},[1136,4194,1235],{"class":1164},[1136,4196,1550],{"class":1314},[1136,4198,4199],{"class":1318},"Product must have name and description",[1136,4201,1550],{"class":1314},[1136,4203,1439],{"class":1164},[1136,4205,4206],{"class":1138,"line":2153},[1136,4207,1874],{"class":1153},[1136,4209,4210,4212,4214,4216,4218,4221,4224],{"class":1138,"line":2159},[1136,4211,1519],{"class":1149},[1136,4213,1337],{"class":1160},[1136,4215,1274],{"class":1164},[1136,4217,1409],{"class":1277},[1136,4219,4220],{"class":1412}," \u003C=",[1136,4222,4223],{"class":3558}," 0",[1136,4225,1208],{"class":1164},[1136,4227,4228,4230,4232,4234,4236,4239,4241],{"class":1138,"line":2177},[1136,4229,1542],{"class":1149},[1136,4231,3917],{"class":1342},[1136,4233,1235],{"class":1164},[1136,4235,1550],{"class":1314},[1136,4237,4238],{"class":1318},"Product must have positive price",[1136,4240,1550],{"class":1314},[1136,4242,1439],{"class":1164},[1136,4244,4245],{"class":1138,"line":2193},[1136,4246,1874],{"class":1153},[1136,4248,4249,4251,4253,4255,4257,4259,4262],{"class":1138,"line":2206},[1136,4250,1271],{"class":1160},[1136,4252,1274],{"class":1164},[1136,4254,1309],{"class":1277},[1136,4256,1281],{"class":1164},[1136,4258,1315],{"class":1314},[1136,4260,4261],{"class":1318},"published",[1136,4263,1322],{"class":1314},[1136,4265,4266],{"class":1138,"line":2223},[1136,4267,1352],{"class":1153},[1136,4269,4270,4272,4275,4277,4279,4281,4283,4285],{"class":1138,"line":2239},[1136,4271,1228],{"class":1200},[1136,4273,4274],{"class":1360}," can_be_deleted",[1136,4276,1235],{"class":1164},[1136,4278,1239],{"class":1238},[1136,4280,1368],{"class":1164},[1136,4282,1371],{"class":1164},[1136,4284,1599],{"class":1251},[1136,4286,1208],{"class":1164},[1136,4288,4289,4291,4294],{"class":1138,"line":2254},[1136,4290,1382],{"class":1214},[1136,4292,4293],{"class":1218},"Business rule for deletion",[1136,4295,1222],{"class":1214},[1136,4297,4298,4300,4302,4304,4306,4309,4311,4313],{"class":1138,"line":2260},[1136,4299,1476],{"class":1149},[1136,4301,1337],{"class":1160},[1136,4303,1274],{"class":1164},[1136,4305,1309],{"class":1277},[1136,4307,4308],{"class":1412}," ==",[1136,4310,1315],{"class":1314},[1136,4312,4112],{"class":1318},[1136,4314,1322],{"class":1314},[1038,4316,4318],{"id":4317},"dependency-inversion","Dependency Inversion",[1126,4320,4322],{"className":1128,"code":4321,"language":1130,"meta":1131,"style":1131},"# Abstract interfaces define contracts\nclass EmailService(Protocol):\n    \"\"\"Email service interface\"\"\"\n    \n    def send_email(self, to: str, subject: str, body: str) -> bool:\n        ...\n\nclass NotificationService(Protocol):\n    \"\"\"Notification service interface\"\"\"\n    \n    def send_notification(self, user_id: int, message: str) -> bool:\n        ...\n\n# High-level modules depend on abstractions\nclass UserRegistrationService:\n    \"\"\"High-level service depending on abstractions\"\"\"\n    \n    def __init__(self, \n                 email_service: EmailService,\n                 notification_service: NotificationService):\n        self.email_service = email_service\n        self.notification_service = notification_service\n    \n    def register_user(self, user_data: dict) -> User:\n        \"\"\"Register new user with notifications\"\"\"\n        user = User.create(user_data)\n        \n        # Send welcome email\n        self.email_service.send_email(\n            to=user.email,\n            subject=\"Welcome!\",\n            body=\"Welcome to our platform!\"\n        )\n        \n        # Send push notification\n        self.notification_service.send_notification(\n            user_id=user.id,\n            message=\"Registration successful!\"\n        )\n        \n        return user\n\n# Low-level modules implement abstractions\nclass DjangoEmailService:\n    \"\"\"Django implementation of email service\"\"\"\n    \n    def send_email(self, to: str, subject: str, body: str) -> bool:\n        try:\n            send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [to])\n            return True\n        except Exception:\n            return False\n\nclass FirebaseNotificationService:\n    \"\"\"Firebase implementation of notification service\"\"\"\n    \n    def send_notification(self, user_id: int, message: str) -> bool:\n        # Firebase push notification logic\n        return True\n",[1133,4323,4324,4329,4343,4352,4356,4402,4407,4411,4424,4433,4437,4474,4478,4482,4487,4496,4505,4509,4523,4534,4544,4558,4570,4574,4603,4612,4632,4636,4641,4656,4673,4689,4704,4708,4712,4717,4732,4747,4761,4765,4769,4776,4780,4785,4794,4803,4807,4849,4855,4890,4897,4906,4913,4917,4926,4935,4939,4973,4978],{"__ignoreMap":1131},[1136,4325,4326],{"class":1138,"line":1139},[1136,4327,4328],{"class":1142},"# Abstract interfaces define contracts\n",[1136,4330,4331,4333,4336,4338,4341],{"class":1138,"line":1146},[1136,4332,1201],{"class":1200},[1136,4334,4335],{"class":1204}," EmailService",[1136,4337,1235],{"class":1164},[1136,4339,4340],{"class":2388},"Protocol",[1136,4342,1265],{"class":1164},[1136,4344,4345,4347,4350],{"class":1138,"line":1171},[1136,4346,1215],{"class":1214},[1136,4348,4349],{"class":1218},"Email service interface",[1136,4351,1222],{"class":1214},[1136,4353,4354],{"class":1138,"line":1184},[1136,4355,1352],{"class":1153},[1136,4357,4358,4360,4363,4365,4367,4369,4372,4374,4376,4378,4381,4383,4385,4387,4390,4392,4394,4396,4398,4400],{"class":1138,"line":1191},[1136,4359,1228],{"class":1200},[1136,4361,4362],{"class":1360}," send_email",[1136,4364,1235],{"class":1164},[1136,4366,1239],{"class":1238},[1136,4368,1165],{"class":1164},[1136,4370,4371],{"class":1244}," to",[1136,4373,1248],{"class":1164},[1136,4375,2865],{"class":1251},[1136,4377,1165],{"class":1164},[1136,4379,4380],{"class":1244}," subject",[1136,4382,1248],{"class":1164},[1136,4384,2865],{"class":1251},[1136,4386,1165],{"class":1164},[1136,4388,4389],{"class":1244}," body",[1136,4391,1248],{"class":1164},[1136,4393,2865],{"class":1251},[1136,4395,1368],{"class":1164},[1136,4397,1371],{"class":1164},[1136,4399,1599],{"class":1251},[1136,4401,1208],{"class":1164},[1136,4403,4404],{"class":1138,"line":1197},[1136,4405,4406],{"class":1160},"        ...\n",[1136,4408,4409],{"class":1138,"line":1211},[1136,4410,1188],{"emptyLinePlaceholder":1187},[1136,4412,4413,4415,4418,4420,4422],{"class":1138,"line":1225},[1136,4414,1201],{"class":1200},[1136,4416,4417],{"class":1204}," NotificationService",[1136,4419,1235],{"class":1164},[1136,4421,4340],{"class":2388},[1136,4423,1265],{"class":1164},[1136,4425,4426,4428,4431],{"class":1138,"line":1268},[1136,4427,1215],{"class":1214},[1136,4429,4430],{"class":1218},"Notification service interface",[1136,4432,1222],{"class":1214},[1136,4434,4435],{"class":1138,"line":1287},[1136,4436,1352],{"class":1153},[1136,4438,4439,4441,4444,4446,4448,4450,4453,4455,4457,4459,4462,4464,4466,4468,4470,4472],{"class":1138,"line":1302},[1136,4440,1228],{"class":1200},[1136,4442,4443],{"class":1360}," send_notification",[1136,4445,1235],{"class":1164},[1136,4447,1239],{"class":1238},[1136,4449,1165],{"class":1164},[1136,4451,4452],{"class":1244}," user_id",[1136,4454,1248],{"class":1164},[1136,4456,1252],{"class":1251},[1136,4458,1165],{"class":1164},[1136,4460,4461],{"class":1244}," message",[1136,4463,1248],{"class":1164},[1136,4465,2865],{"class":1251},[1136,4467,1368],{"class":1164},[1136,4469,1371],{"class":1164},[1136,4471,1599],{"class":1251},[1136,4473,1208],{"class":1164},[1136,4475,4476],{"class":1138,"line":1325},[1136,4477,4406],{"class":1160},[1136,4479,4480],{"class":1138,"line":1349},[1136,4481,1188],{"emptyLinePlaceholder":1187},[1136,4483,4484],{"class":1138,"line":1355},[1136,4485,4486],{"class":1142},"# High-level modules depend on abstractions\n",[1136,4488,4489,4491,4494],{"class":1138,"line":1379},[1136,4490,1201],{"class":1200},[1136,4492,4493],{"class":1204}," UserRegistrationService",[1136,4495,1208],{"class":1164},[1136,4497,4498,4500,4503],{"class":1138,"line":1390},[1136,4499,1215],{"class":1214},[1136,4501,4502],{"class":1218},"High-level service depending on abstractions",[1136,4504,1222],{"class":1214},[1136,4506,4507],{"class":1138,"line":1442},[1136,4508,1352],{"class":1153},[1136,4510,4511,4513,4515,4517,4519,4521],{"class":1138,"line":1473},[1136,4512,1228],{"class":1200},[1136,4514,1232],{"class":1231},[1136,4516,1235],{"class":1164},[1136,4518,1239],{"class":1238},[1136,4520,1165],{"class":1164},[1136,4522,1711],{"class":1153},[1136,4524,4525,4528,4530,4532],{"class":1138,"line":1487},[1136,4526,4527],{"class":1244},"                 email_service",[1136,4529,1248],{"class":1164},[1136,4531,4335],{"class":1153},[1136,4533,1729],{"class":1164},[1136,4535,4536,4538,4540,4542],{"class":1138,"line":1492},[1136,4537,1735],{"class":1244},[1136,4539,1248],{"class":1164},[1136,4541,4417],{"class":1153},[1136,4543,1265],{"class":1164},[1136,4545,4546,4548,4550,4553,4555],{"class":1138,"line":1506},[1136,4547,1271],{"class":1160},[1136,4549,1274],{"class":1164},[1136,4551,4552],{"class":1277},"email_service",[1136,4554,1281],{"class":1164},[1136,4556,4557],{"class":1153}," email_service\n",[1136,4559,4560,4562,4564,4566,4568],{"class":1138,"line":1516},[1136,4561,1271],{"class":1160},[1136,4563,1274],{"class":1164},[1136,4565,1786],{"class":1277},[1136,4567,1281],{"class":1164},[1136,4569,1791],{"class":1153},[1136,4571,4572],{"class":1138,"line":1539},[1136,4573,1352],{"class":1153},[1136,4575,4576,4578,4581,4583,4585,4587,4590,4592,4594,4596,4598,4601],{"class":1138,"line":1560},[1136,4577,1228],{"class":1200},[1136,4579,4580],{"class":1360}," register_user",[1136,4582,1235],{"class":1164},[1136,4584,1239],{"class":1238},[1136,4586,1165],{"class":1164},[1136,4588,4589],{"class":1244}," user_data",[1136,4591,1248],{"class":1164},[1136,4593,2359],{"class":1251},[1136,4595,1368],{"class":1164},[1136,4597,1371],{"class":1164},[1136,4599,4600],{"class":1153}," User",[1136,4602,1208],{"class":1164},[1136,4604,4605,4607,4610],{"class":1138,"line":1578},[1136,4606,1382],{"class":1214},[1136,4608,4609],{"class":1218},"Register new user with notifications",[1136,4611,1222],{"class":1214},[1136,4613,4614,4617,4619,4621,4623,4625,4627,4630],{"class":1138,"line":1583},[1136,4615,4616],{"class":1153},"        user ",[1136,4618,1396],{"class":1164},[1136,4620,4600],{"class":1153},[1136,4622,1274],{"class":1164},[1136,4624,2088],{"class":1342},[1136,4626,1235],{"class":1164},[1136,4628,4629],{"class":1342},"user_data",[1136,4631,1439],{"class":1164},[1136,4633,4634],{"class":1138,"line":1604},[1136,4635,1874],{"class":1153},[1136,4637,4638],{"class":1138,"line":1614},[1136,4639,4640],{"class":1142},"        # Send welcome email\n",[1136,4642,4643,4645,4647,4649,4651,4654],{"class":1138,"line":1648},[1136,4644,1271],{"class":1160},[1136,4646,1274],{"class":1164},[1136,4648,4552],{"class":1277},[1136,4650,1274],{"class":1164},[1136,4652,4653],{"class":1342},"send_email",[1136,4655,2091],{"class":1164},[1136,4657,4658,4661,4663,4666,4668,4671],{"class":1138,"line":1653},[1136,4659,4660],{"class":2097},"            to",[1136,4662,1396],{"class":1164},[1136,4664,4665],{"class":1342},"user",[1136,4667,1274],{"class":1164},[1136,4669,4670],{"class":1277},"email",[1136,4672,1729],{"class":1164},[1136,4674,4675,4678,4680,4682,4685,4687],{"class":1138,"line":1659},[1136,4676,4677],{"class":2097},"            subject",[1136,4679,1396],{"class":1164},[1136,4681,1550],{"class":1314},[1136,4683,4684],{"class":1318},"Welcome!",[1136,4686,1550],{"class":1314},[1136,4688,1729],{"class":1164},[1136,4690,4691,4694,4696,4698,4701],{"class":1138,"line":1669},[1136,4692,4693],{"class":2097},"            body",[1136,4695,1396],{"class":1164},[1136,4697,1550],{"class":1314},[1136,4699,4700],{"class":1318},"Welcome to our platform!",[1136,4702,4703],{"class":1314},"\"\n",[1136,4705,4706],{"class":1138,"line":1679},[1136,4707,2145],{"class":1164},[1136,4709,4710],{"class":1138,"line":1684},[1136,4711,1874],{"class":1153},[1136,4713,4714],{"class":1138,"line":1714},[1136,4715,4716],{"class":1142},"        # Send push notification\n",[1136,4718,4719,4721,4723,4725,4727,4730],{"class":1138,"line":1732},[1136,4720,1271],{"class":1160},[1136,4722,1274],{"class":1164},[1136,4724,1786],{"class":1277},[1136,4726,1274],{"class":1164},[1136,4728,4729],{"class":1342},"send_notification",[1136,4731,2091],{"class":1164},[1136,4733,4734,4737,4739,4741,4743,4745],{"class":1138,"line":1749},[1136,4735,4736],{"class":2097},"            user_id",[1136,4738,1396],{"class":1164},[1136,4740,4665],{"class":1342},[1136,4742,1274],{"class":1164},[1136,4744,3496],{"class":1277},[1136,4746,1729],{"class":1164},[1136,4748,4749,4752,4754,4756,4759],{"class":1138,"line":1764},[1136,4750,4751],{"class":2097},"            message",[1136,4753,1396],{"class":1164},[1136,4755,1550],{"class":1314},[1136,4757,4758],{"class":1318},"Registration successful!",[1136,4760,4703],{"class":1314},[1136,4762,4763],{"class":1138,"line":1779},[1136,4764,2145],{"class":1164},[1136,4766,4767],{"class":1138,"line":1794},[1136,4768,1874],{"class":1153},[1136,4770,4771,4773],{"class":1138,"line":1799},[1136,4772,1476],{"class":1149},[1136,4774,4775],{"class":1153}," user\n",[1136,4777,4778],{"class":1138,"line":1835},[1136,4779,1188],{"emptyLinePlaceholder":1187},[1136,4781,4782],{"class":1138,"line":1845},[1136,4783,4784],{"class":1142},"# Low-level modules implement abstractions\n",[1136,4786,4787,4789,4792],{"class":1138,"line":1851},[1136,4788,1201],{"class":1200},[1136,4790,4791],{"class":1204}," DjangoEmailService",[1136,4793,1208],{"class":1164},[1136,4795,4796,4798,4801],{"class":1138,"line":1871},[1136,4797,1215],{"class":1214},[1136,4799,4800],{"class":1218},"Django implementation of email service",[1136,4802,1222],{"class":1214},[1136,4804,4805],{"class":1138,"line":1877},[1136,4806,1352],{"class":1153},[1136,4808,4809,4811,4813,4815,4817,4819,4821,4823,4825,4827,4829,4831,4833,4835,4837,4839,4841,4843,4845,4847],{"class":1138,"line":1883},[1136,4810,1228],{"class":1200},[1136,4812,4362],{"class":1360},[1136,4814,1235],{"class":1164},[1136,4816,1239],{"class":1238},[1136,4818,1165],{"class":1164},[1136,4820,4371],{"class":1244},[1136,4822,1248],{"class":1164},[1136,4824,2865],{"class":1251},[1136,4826,1165],{"class":1164},[1136,4828,4380],{"class":1244},[1136,4830,1248],{"class":1164},[1136,4832,2865],{"class":1251},[1136,4834,1165],{"class":1164},[1136,4836,4389],{"class":1244},[1136,4838,1248],{"class":1164},[1136,4840,2865],{"class":1251},[1136,4842,1368],{"class":1164},[1136,4844,1371],{"class":1164},[1136,4846,1599],{"class":1251},[1136,4848,1208],{"class":1164},[1136,4850,4851,4853],{"class":1138,"line":1895},[1136,4852,3401],{"class":1149},[1136,4854,1208],{"class":1164},[1136,4856,4857,4860,4862,4865,4867,4869,4871,4874,4876,4880,4882,4884,4887],{"class":1138,"line":1913},[1136,4858,4859],{"class":1342},"            send_mail",[1136,4861,1235],{"class":1164},[1136,4863,4864],{"class":1342},"subject",[1136,4866,1165],{"class":1164},[1136,4868,4389],{"class":1342},[1136,4870,1165],{"class":1164},[1136,4872,4873],{"class":1342}," settings",[1136,4875,1274],{"class":1164},[1136,4877,4879],{"class":4878},"sFGJz","DEFAULT_FROM_EMAIL",[1136,4881,1165],{"class":1164},[1136,4883,1628],{"class":1164},[1136,4885,4886],{"class":1342},"to",[1136,4888,4889],{"class":1164},"])\n",[1136,4891,4892,4894],{"class":1138,"line":1918},[1136,4893,3482],{"class":1149},[1136,4895,4896],{"class":2465}," True\n",[1136,4898,4899,4901,4904],{"class":1138,"line":1924},[1136,4900,3570],{"class":1149},[1136,4902,4903],{"class":1251}," Exception",[1136,4905,1208],{"class":1164},[1136,4907,4908,4910],{"class":1138,"line":1950},[1136,4909,3482],{"class":1149},[1136,4911,4912],{"class":2465}," False\n",[1136,4914,4915],{"class":1138,"line":1955},[1136,4916,1188],{"emptyLinePlaceholder":1187},[1136,4918,4919,4921,4924],{"class":1138,"line":1961},[1136,4920,1201],{"class":1200},[1136,4922,4923],{"class":1204}," FirebaseNotificationService",[1136,4925,1208],{"class":1164},[1136,4927,4928,4930,4933],{"class":1138,"line":1982},[1136,4929,1215],{"class":1214},[1136,4931,4932],{"class":1218},"Firebase implementation of notification service",[1136,4934,1222],{"class":1214},[1136,4936,4937],{"class":1138,"line":1987},[1136,4938,1352],{"class":1153},[1136,4940,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959,4961,4963,4965,4967,4969,4971],{"class":1138,"line":1995},[1136,4942,1228],{"class":1200},[1136,4944,4443],{"class":1360},[1136,4946,1235],{"class":1164},[1136,4948,1239],{"class":1238},[1136,4950,1165],{"class":1164},[1136,4952,4452],{"class":1244},[1136,4954,1248],{"class":1164},[1136,4956,1252],{"class":1251},[1136,4958,1165],{"class":1164},[1136,4960,4461],{"class":1244},[1136,4962,1248],{"class":1164},[1136,4964,2865],{"class":1251},[1136,4966,1368],{"class":1164},[1136,4968,1371],{"class":1164},[1136,4970,1599],{"class":1251},[1136,4972,1208],{"class":1164},[1136,4974,4975],{"class":1138,"line":2000},[1136,4976,4977],{"class":1142},"        # Firebase push notification logic\n",[1136,4979,4980,4982],{"class":1138,"line":2006},[1136,4981,1476],{"class":1149},[1136,4983,4896],{"class":2465},[1030,4985,4987],{"id":4986},"what-youll-learn","What You'll Learn",[1026,4989,4990],{},"This advanced guide covers the most sophisticated aspects of Django development:",[1026,4992,4993,4995],{},[1045,4994,807],{},": Master enterprise architecture patterns including hexagonal architecture, clean architecture, CQRS, and event sourcing. Learn to design systems that are maintainable, testable, and scalable.",[1026,4997,4998,5000],{},[1045,4999,811],{},": Apply DDD principles to create rich domain models, implement bounded contexts, design aggregates, and build domain services that encapsulate complex business logic.",[1026,5002,5003,5005],{},[1045,5004,815],{},": Organize massive Django projects with hundreds of models and thousands of views. Implement modular architectures, manage dependencies, and scale development teams effectively.",[1026,5007,5008,5010],{},[1045,5009,819],{},": Create extensible applications with plugin systems, implement dynamic loading, design stable APIs, and build ecosystems of interoperable components.",[1026,5012,5013,5015],{},[1045,5014,823],{},": Deep dive into Django's internals to create custom model fields, database backends, template engines, and middleware that extend the framework's capabilities.",[1026,5017,5018,5020],{},[1045,5019,827],{},": Build sophisticated database queries with custom expressions, window functions, and database-specific optimizations that push Django's ORM to its limits.",[1026,5022,5023,5025],{},[1045,5024,831],{},": Create powerful command-line tools with argument parsing, progress tracking, and integration with Django's ecosystem for administrative and maintenance tasks.",[1026,5027,5028,5030],{},[1045,5029,835],{},": Master Django's signal system for building decoupled, event-driven architectures with proper error handling and performance considerations.",[1026,5032,5033,5035],{},[1045,5034,839],{},": Create, package, and distribute Django applications with proper documentation, testing, and version management for the broader Django community.",[1026,5037,5038,5040],{},[1045,5039,843],{},": Design and implement microservice architectures with Django, including service discovery, inter-service communication, and distributed system patterns.",[1026,5042,5043,5045],{},[1045,5044,847],{},": Implement enterprise-grade security measures including advanced authentication, authorization patterns, security monitoring, and compliance frameworks.",[1030,5047,5049],{"id":5048},"real-world-enterprise-examples","Real-World Enterprise Examples",[1038,5051,5053],{"id":5052},"case-study-e-commerce-platform-architecture","Case Study: E-commerce Platform Architecture",[1126,5055,5057],{"className":1128,"code":5056,"language":1130,"meta":1131,"style":1131},"# Domain-driven design for e-commerce\nclass OrderAggregate:\n    \"\"\"Order aggregate root with business invariants\"\"\"\n    \n    def __init__(self, customer_id: int):\n        self.customer_id = customer_id\n        self.items = []\n        self.status = OrderStatus.DRAFT\n        self.total = Decimal('0.00')\n    \n    def add_item(self, product_id: int, quantity: int, price: Decimal):\n        \"\"\"Add item with business rules\"\"\"\n        if self.status != OrderStatus.DRAFT:\n            raise DomainError(\"Cannot modify confirmed order\")\n        \n        if quantity \u003C= 0:\n            raise DomainError(\"Quantity must be positive\")\n        \n        # Check for existing item\n        existing_item = self._find_item(product_id)\n        if existing_item:\n            existing_item.quantity += quantity\n        else:\n            self.items.append(OrderItem(product_id, quantity, price))\n        \n        self._recalculate_total()\n    \n    def confirm(self):\n        \"\"\"Confirm order with business validation\"\"\"\n        if not self.items:\n            raise DomainError(\"Cannot confirm empty order\")\n        \n        if self.total \u003C= 0:\n            raise DomainError(\"Order total must be positive\")\n        \n        self.status = OrderStatus.CONFIRMED\n        \n        # Raise domain event\n        DomainEvents.raise_event(OrderConfirmed(self))\n\n# Application service orchestrating use cases\nclass OrderApplicationService:\n    \"\"\"Application service for order operations\"\"\"\n    \n    def __init__(self, \n                 order_repo: OrderRepository,\n                 product_repo: ProductRepository,\n                 inventory_service: InventoryService,\n                 pricing_service: PricingService):\n        self.order_repo = order_repo\n        self.product_repo = product_repo\n        self.inventory_service = inventory_service\n        self.pricing_service = pricing_service\n    \n    @transaction.atomic\n    def place_order(self, command: PlaceOrderCommand) -> OrderId:\n        \"\"\"Place order use case\"\"\"\n        # Load aggregate\n        order = OrderAggregate(command.customer_id)\n        \n        # Process each item\n        for item_data in command.items:\n            # Validate product exists\n            product = self.product_repo.get_by_id(item_data.product_id)\n            if not product:\n                raise ApplicationError(f\"Product {item_data.product_id} not found\")\n            \n            # Check inventory\n            if not self.inventory_service.is_available(\n                item_data.product_id, item_data.quantity\n            ):\n                raise ApplicationError(f\"Insufficient inventory for {product.name}\")\n            \n            # Get current price\n            current_price = self.pricing_service.get_price(item_data.product_id)\n            \n            # Add to order\n            order.add_item(item_data.product_id, item_data.quantity, current_price)\n        \n        # Confirm order\n        order.confirm()\n        \n        # Reserve inventory\n        for item in order.items:\n            self.inventory_service.reserve(item.product_id, item.quantity)\n        \n        # Save aggregate\n        order_id = self.order_repo.save(order)\n        \n        # Publish domain events\n        DomainEvents.publish_events()\n        \n        return order_id\n",[1133,5058,5059,5064,5073,5082,5086,5106,5118,5131,5149,5172,5176,5216,5225,5246,5264,5268,5282,5299,5303,5308,5328,5337,5352,5359,5393,5397,5408,5412,5424,5433,5447,5464,5468,5484,5501,5505,5522,5526,5531,5552,5556,5561,5570,5579,5583,5597,5609,5620,5632,5642,5654,5666,5680,5692,5696,5708,5737,5746,5751,5770,5774,5779,5796,5801,5829,5840,5870,5874,5879,5898,5917,5922,5949,5953,5958,5986,5990,5995,6028,6032,6037,6049,6053,6058,6074,6105,6109,6114,6137,6142,6148,6160,6165],{"__ignoreMap":1131},[1136,5060,5061],{"class":1138,"line":1139},[1136,5062,5063],{"class":1142},"# Domain-driven design for e-commerce\n",[1136,5065,5066,5068,5071],{"class":1138,"line":1146},[1136,5067,1201],{"class":1200},[1136,5069,5070],{"class":1204}," OrderAggregate",[1136,5072,1208],{"class":1164},[1136,5074,5075,5077,5080],{"class":1138,"line":1171},[1136,5076,1215],{"class":1214},[1136,5078,5079],{"class":1218},"Order aggregate root with business invariants",[1136,5081,1222],{"class":1214},[1136,5083,5084],{"class":1138,"line":1184},[1136,5085,1352],{"class":1153},[1136,5087,5088,5090,5092,5094,5096,5098,5100,5102,5104],{"class":1138,"line":1191},[1136,5089,1228],{"class":1200},[1136,5091,1232],{"class":1231},[1136,5093,1235],{"class":1164},[1136,5095,1239],{"class":1238},[1136,5097,1165],{"class":1164},[1136,5099,1245],{"class":1244},[1136,5101,1248],{"class":1164},[1136,5103,1252],{"class":1251},[1136,5105,1265],{"class":1164},[1136,5107,5108,5110,5112,5114,5116],{"class":1138,"line":1197},[1136,5109,1271],{"class":1160},[1136,5111,1274],{"class":1164},[1136,5113,1278],{"class":1277},[1136,5115,1281],{"class":1164},[1136,5117,1284],{"class":1153},[1136,5119,5120,5122,5124,5126,5128],{"class":1138,"line":1211},[1136,5121,1271],{"class":1160},[1136,5123,1274],{"class":1164},[1136,5125,1294],{"class":1277},[1136,5127,1281],{"class":1164},[1136,5129,5130],{"class":1164}," []\n",[1136,5132,5133,5135,5137,5139,5141,5144,5146],{"class":1138,"line":1225},[1136,5134,1271],{"class":1160},[1136,5136,1274],{"class":1164},[1136,5138,1309],{"class":1277},[1136,5140,1281],{"class":1164},[1136,5142,5143],{"class":1153}," OrderStatus",[1136,5145,1274],{"class":1164},[1136,5147,5148],{"class":4878},"DRAFT\n",[1136,5150,5151,5153,5155,5157,5159,5161,5163,5165,5168,5170],{"class":1138,"line":1268},[1136,5152,1271],{"class":1160},[1136,5154,1274],{"class":1164},[1136,5156,1332],{"class":1277},[1136,5158,1281],{"class":1164},[1136,5160,1374],{"class":1342},[1136,5162,1235],{"class":1164},[1136,5164,1460],{"class":1314},[1136,5166,5167],{"class":1318},"0.00",[1136,5169,1460],{"class":1314},[1136,5171,1439],{"class":1164},[1136,5173,5174],{"class":1138,"line":1287},[1136,5175,1352],{"class":1153},[1136,5177,5178,5180,5183,5185,5187,5189,5192,5194,5196,5198,5201,5203,5205,5207,5210,5212,5214],{"class":1138,"line":1302},[1136,5179,1228],{"class":1200},[1136,5181,5182],{"class":1360}," add_item",[1136,5184,1235],{"class":1164},[1136,5186,1239],{"class":1238},[1136,5188,1165],{"class":1164},[1136,5190,5191],{"class":1244}," product_id",[1136,5193,1248],{"class":1164},[1136,5195,1252],{"class":1251},[1136,5197,1165],{"class":1164},[1136,5199,5200],{"class":1244}," quantity",[1136,5202,1248],{"class":1164},[1136,5204,1252],{"class":1251},[1136,5206,1165],{"class":1164},[1136,5208,5209],{"class":1244}," price",[1136,5211,1248],{"class":1164},[1136,5213,1374],{"class":1153},[1136,5215,1265],{"class":1164},[1136,5217,5218,5220,5223],{"class":1138,"line":1325},[1136,5219,1382],{"class":1214},[1136,5221,5222],{"class":1218},"Add item with business rules",[1136,5224,1222],{"class":1214},[1136,5226,5227,5229,5231,5233,5235,5237,5239,5241,5244],{"class":1138,"line":1349},[1136,5228,1519],{"class":1149},[1136,5230,1337],{"class":1160},[1136,5232,1274],{"class":1164},[1136,5234,1309],{"class":1277},[1136,5236,1528],{"class":1412},[1136,5238,5143],{"class":1153},[1136,5240,1274],{"class":1164},[1136,5242,5243],{"class":4878},"DRAFT",[1136,5245,1208],{"class":1164},[1136,5247,5248,5250,5253,5255,5257,5260,5262],{"class":1138,"line":1355},[1136,5249,1542],{"class":1149},[1136,5251,5252],{"class":1342}," DomainError",[1136,5254,1235],{"class":1164},[1136,5256,1550],{"class":1314},[1136,5258,5259],{"class":1318},"Cannot modify confirmed order",[1136,5261,1550],{"class":1314},[1136,5263,1439],{"class":1164},[1136,5265,5266],{"class":1138,"line":1379},[1136,5267,1874],{"class":1153},[1136,5269,5270,5272,5275,5278,5280],{"class":1138,"line":1390},[1136,5271,1519],{"class":1149},[1136,5273,5274],{"class":1153}," quantity ",[1136,5276,5277],{"class":1412},"\u003C=",[1136,5279,4223],{"class":3558},[1136,5281,1208],{"class":1164},[1136,5283,5284,5286,5288,5290,5292,5295,5297],{"class":1138,"line":1442},[1136,5285,1542],{"class":1149},[1136,5287,5252],{"class":1342},[1136,5289,1235],{"class":1164},[1136,5291,1550],{"class":1314},[1136,5293,5294],{"class":1318},"Quantity must be positive",[1136,5296,1550],{"class":1314},[1136,5298,1439],{"class":1164},[1136,5300,5301],{"class":1138,"line":1473},[1136,5302,1874],{"class":1153},[1136,5304,5305],{"class":1138,"line":1487},[1136,5306,5307],{"class":1142},"        # Check for existing item\n",[1136,5309,5310,5313,5315,5317,5319,5322,5324,5326],{"class":1138,"line":1492},[1136,5311,5312],{"class":1153},"        existing_item ",[1136,5314,1396],{"class":1164},[1136,5316,1337],{"class":1160},[1136,5318,1274],{"class":1164},[1136,5320,5321],{"class":1342},"_find_item",[1136,5323,1235],{"class":1164},[1136,5325,2218],{"class":1342},[1136,5327,1439],{"class":1164},[1136,5329,5330,5332,5335],{"class":1138,"line":1506},[1136,5331,1519],{"class":1149},[1136,5333,5334],{"class":1153}," existing_item",[1136,5336,1208],{"class":1164},[1136,5338,5339,5342,5344,5346,5349],{"class":1138,"line":1516},[1136,5340,5341],{"class":1153},"            existing_item",[1136,5343,1274],{"class":1164},[1136,5345,1421],{"class":1277},[1136,5347,5348],{"class":1164}," +=",[1136,5350,5351],{"class":1153}," quantity\n",[1136,5353,5354,5357],{"class":1138,"line":1539},[1136,5355,5356],{"class":1149},"        else",[1136,5358,1208],{"class":1164},[1136,5360,5361,5364,5366,5368,5370,5373,5375,5378,5380,5382,5384,5386,5388,5390],{"class":1138,"line":1560},[1136,5362,5363],{"class":1160},"            self",[1136,5365,1274],{"class":1164},[1136,5367,1294],{"class":1277},[1136,5369,1274],{"class":1164},[1136,5371,5372],{"class":1342},"append",[1136,5374,1235],{"class":1164},[1136,5376,5377],{"class":1342},"OrderItem",[1136,5379,1235],{"class":1164},[1136,5381,2218],{"class":1342},[1136,5383,1165],{"class":1164},[1136,5385,5200],{"class":1342},[1136,5387,1165],{"class":1164},[1136,5389,5209],{"class":1342},[1136,5391,5392],{"class":1164},"))\n",[1136,5394,5395],{"class":1138,"line":1578},[1136,5396,1874],{"class":1153},[1136,5398,5399,5401,5403,5406],{"class":1138,"line":1583},[1136,5400,1271],{"class":1160},[1136,5402,1274],{"class":1164},[1136,5404,5405],{"class":1342},"_recalculate_total",[1136,5407,1346],{"class":1164},[1136,5409,5410],{"class":1138,"line":1604},[1136,5411,1352],{"class":1153},[1136,5413,5414,5416,5418,5420,5422],{"class":1138,"line":1614},[1136,5415,1228],{"class":1200},[1136,5417,1497],{"class":1360},[1136,5419,1235],{"class":1164},[1136,5421,1239],{"class":1238},[1136,5423,1265],{"class":1164},[1136,5425,5426,5428,5431],{"class":1138,"line":1648},[1136,5427,1382],{"class":1214},[1136,5429,5430],{"class":1218},"Confirm order with business validation",[1136,5432,1222],{"class":1214},[1136,5434,5435,5437,5439,5441,5443,5445],{"class":1138,"line":1653},[1136,5436,1519],{"class":1149},[1136,5438,1888],{"class":1412},[1136,5440,1337],{"class":1160},[1136,5442,1274],{"class":1164},[1136,5444,1294],{"class":1277},[1136,5446,1208],{"class":1164},[1136,5448,5449,5451,5453,5455,5457,5460,5462],{"class":1138,"line":1659},[1136,5450,1542],{"class":1149},[1136,5452,5252],{"class":1342},[1136,5454,1235],{"class":1164},[1136,5456,1550],{"class":1314},[1136,5458,5459],{"class":1318},"Cannot confirm empty order",[1136,5461,1550],{"class":1314},[1136,5463,1439],{"class":1164},[1136,5465,5466],{"class":1138,"line":1669},[1136,5467,1874],{"class":1153},[1136,5469,5470,5472,5474,5476,5478,5480,5482],{"class":1138,"line":1679},[1136,5471,1519],{"class":1149},[1136,5473,1337],{"class":1160},[1136,5475,1274],{"class":1164},[1136,5477,1332],{"class":1277},[1136,5479,4220],{"class":1412},[1136,5481,4223],{"class":3558},[1136,5483,1208],{"class":1164},[1136,5485,5486,5488,5490,5492,5494,5497,5499],{"class":1138,"line":1684},[1136,5487,1542],{"class":1149},[1136,5489,5252],{"class":1342},[1136,5491,1235],{"class":1164},[1136,5493,1550],{"class":1314},[1136,5495,5496],{"class":1318},"Order total must be positive",[1136,5498,1550],{"class":1314},[1136,5500,1439],{"class":1164},[1136,5502,5503],{"class":1138,"line":1714},[1136,5504,1874],{"class":1153},[1136,5506,5507,5509,5511,5513,5515,5517,5519],{"class":1138,"line":1732},[1136,5508,1271],{"class":1160},[1136,5510,1274],{"class":1164},[1136,5512,1309],{"class":1277},[1136,5514,1281],{"class":1164},[1136,5516,5143],{"class":1153},[1136,5518,1274],{"class":1164},[1136,5520,5521],{"class":4878},"CONFIRMED\n",[1136,5523,5524],{"class":1138,"line":1749},[1136,5525,1874],{"class":1153},[1136,5527,5528],{"class":1138,"line":1764},[1136,5529,5530],{"class":1142},"        # Raise domain event\n",[1136,5532,5533,5536,5538,5541,5543,5546,5548,5550],{"class":1138,"line":1779},[1136,5534,5535],{"class":1153},"        DomainEvents",[1136,5537,1274],{"class":1164},[1136,5539,5540],{"class":1342},"raise_event",[1136,5542,1235],{"class":1164},[1136,5544,5545],{"class":1342},"OrderConfirmed",[1136,5547,1235],{"class":1164},[1136,5549,1239],{"class":1160},[1136,5551,5392],{"class":1164},[1136,5553,5554],{"class":1138,"line":1794},[1136,5555,1188],{"emptyLinePlaceholder":1187},[1136,5557,5558],{"class":1138,"line":1799},[1136,5559,5560],{"class":1142},"# Application service orchestrating use cases\n",[1136,5562,5563,5565,5568],{"class":1138,"line":1835},[1136,5564,1201],{"class":1200},[1136,5566,5567],{"class":1204}," OrderApplicationService",[1136,5569,1208],{"class":1164},[1136,5571,5572,5574,5577],{"class":1138,"line":1845},[1136,5573,1215],{"class":1214},[1136,5575,5576],{"class":1218},"Application service for order operations",[1136,5578,1222],{"class":1214},[1136,5580,5581],{"class":1138,"line":1851},[1136,5582,1352],{"class":1153},[1136,5584,5585,5587,5589,5591,5593,5595],{"class":1138,"line":1871},[1136,5586,1228],{"class":1200},[1136,5588,1232],{"class":1231},[1136,5590,1235],{"class":1164},[1136,5592,1239],{"class":1238},[1136,5594,1165],{"class":1164},[1136,5596,1711],{"class":1153},[1136,5598,5599,5602,5604,5607],{"class":1138,"line":1877},[1136,5600,5601],{"class":1244},"                 order_repo",[1136,5603,1248],{"class":1164},[1136,5605,5606],{"class":1153}," OrderRepository",[1136,5608,1729],{"class":1164},[1136,5610,5611,5614,5616,5618],{"class":1138,"line":1883},[1136,5612,5613],{"class":1244},"                 product_repo",[1136,5615,1248],{"class":1164},[1136,5617,3712],{"class":1153},[1136,5619,1729],{"class":1164},[1136,5621,5622,5625,5627,5630],{"class":1138,"line":1895},[1136,5623,5624],{"class":1244},"                 inventory_service",[1136,5626,1248],{"class":1164},[1136,5628,5629],{"class":1153}," InventoryService",[1136,5631,1729],{"class":1164},[1136,5633,5634,5636,5638,5640],{"class":1138,"line":1913},[1136,5635,3719],{"class":1244},[1136,5637,1248],{"class":1164},[1136,5639,3724],{"class":1153},[1136,5641,1265],{"class":1164},[1136,5643,5644,5646,5648,5650,5652],{"class":1138,"line":1918},[1136,5645,1271],{"class":1160},[1136,5647,1274],{"class":1164},[1136,5649,1756],{"class":1277},[1136,5651,1281],{"class":1164},[1136,5653,1761],{"class":1153},[1136,5655,5656,5658,5660,5662,5664],{"class":1138,"line":1924},[1136,5657,1271],{"class":1160},[1136,5659,1274],{"class":1164},[1136,5661,3735],{"class":1277},[1136,5663,1281],{"class":1164},[1136,5665,3740],{"class":1153},[1136,5667,5668,5670,5672,5675,5677],{"class":1138,"line":1950},[1136,5669,1271],{"class":1160},[1136,5671,1274],{"class":1164},[1136,5673,5674],{"class":1277},"inventory_service",[1136,5676,1281],{"class":1164},[1136,5678,5679],{"class":1153}," inventory_service\n",[1136,5681,5682,5684,5686,5688,5690],{"class":1138,"line":1955},[1136,5683,1271],{"class":1160},[1136,5685,1274],{"class":1164},[1136,5687,3749],{"class":1277},[1136,5689,1281],{"class":1164},[1136,5691,3754],{"class":1153},[1136,5693,5694],{"class":1138,"line":1961},[1136,5695,1352],{"class":1153},[1136,5697,5698,5700,5703,5705],{"class":1138,"line":1982},[1136,5699,2326],{"class":1164},[1136,5701,5702],{"class":1360},"transaction",[1136,5704,1274],{"class":1164},[1136,5706,5707],{"class":1360},"atomic\n",[1136,5709,5710,5712,5714,5716,5718,5720,5723,5725,5728,5730,5732,5735],{"class":1138,"line":1987},[1136,5711,1228],{"class":1200},[1136,5713,1804],{"class":1360},[1136,5715,1235],{"class":1164},[1136,5717,1239],{"class":1238},[1136,5719,1165],{"class":1164},[1136,5721,5722],{"class":1244}," command",[1136,5724,1248],{"class":1164},[1136,5726,5727],{"class":1153}," PlaceOrderCommand",[1136,5729,1368],{"class":1164},[1136,5731,1371],{"class":1164},[1136,5733,5734],{"class":1153}," OrderId",[1136,5736,1208],{"class":1164},[1136,5738,5739,5741,5744],{"class":1138,"line":1995},[1136,5740,1382],{"class":1214},[1136,5742,5743],{"class":1218},"Place order use case",[1136,5745,1222],{"class":1214},[1136,5747,5748],{"class":1138,"line":2000},[1136,5749,5750],{"class":1142},"        # Load aggregate\n",[1136,5752,5753,5755,5757,5759,5761,5764,5766,5768],{"class":1138,"line":2006},[1136,5754,1854],{"class":1153},[1136,5756,1396],{"class":1164},[1136,5758,5070],{"class":1342},[1136,5760,1235],{"class":1164},[1136,5762,5763],{"class":1342},"command",[1136,5765,1274],{"class":1164},[1136,5767,1278],{"class":1277},[1136,5769,1439],{"class":1164},[1136,5771,5772],{"class":1138,"line":2016},[1136,5773,1874],{"class":1153},[1136,5775,5776],{"class":1138,"line":2026},[1136,5777,5778],{"class":1142},"        # Process each item\n",[1136,5780,5781,5783,5786,5788,5790,5792,5794],{"class":1138,"line":2031},[1136,5782,2162],{"class":1149},[1136,5784,5785],{"class":1153}," item_data ",[1136,5787,1430],{"class":1149},[1136,5789,5722],{"class":1153},[1136,5791,1274],{"class":1164},[1136,5793,1294],{"class":1277},[1136,5795,1208],{"class":1164},[1136,5797,5798],{"class":1138,"line":2060},[1136,5799,5800],{"class":1142},"            # Validate product exists\n",[1136,5802,5803,5805,5807,5809,5811,5813,5815,5818,5820,5823,5825,5827],{"class":1138,"line":2070},[1136,5804,3449],{"class":1153},[1136,5806,1396],{"class":1164},[1136,5808,1337],{"class":1160},[1136,5810,1274],{"class":1164},[1136,5812,3735],{"class":1277},[1136,5814,1274],{"class":1164},[1136,5816,5817],{"class":1342},"get_by_id",[1136,5819,1235],{"class":1164},[1136,5821,5822],{"class":1342},"item_data",[1136,5824,1274],{"class":1164},[1136,5826,2218],{"class":1277},[1136,5828,1439],{"class":1164},[1136,5830,5831,5834,5836,5838],{"class":1138,"line":2094},[1136,5832,5833],{"class":1149},"            if",[1136,5835,1888],{"class":1412},[1136,5837,3503],{"class":1153},[1136,5839,1208],{"class":1164},[1136,5841,5842,5845,5848,5850,5852,5855,5857,5859,5861,5863,5865,5868],{"class":1138,"line":2111},[1136,5843,5844],{"class":1149},"                raise",[1136,5846,5847],{"class":1342}," ApplicationError",[1136,5849,1235],{"class":1164},[1136,5851,2922],{"class":1200},[1136,5853,5854],{"class":1318},"\"Product ",[1136,5856,2929],{"class":2928},[1136,5858,5822],{"class":1342},[1136,5860,1274],{"class":1164},[1136,5862,2218],{"class":1277},[1136,5864,2934],{"class":2928},[1136,5866,5867],{"class":1318}," not found\"",[1136,5869,1439],{"class":1164},[1136,5871,5872],{"class":1138,"line":2127},[1136,5873,3439],{"class":1153},[1136,5875,5876],{"class":1138,"line":2142},[1136,5877,5878],{"class":1142},"            # Check inventory\n",[1136,5880,5881,5883,5885,5887,5889,5891,5893,5896],{"class":1138,"line":2148},[1136,5882,5833],{"class":1149},[1136,5884,1888],{"class":1412},[1136,5886,1337],{"class":1160},[1136,5888,1274],{"class":1164},[1136,5890,5674],{"class":1277},[1136,5892,1274],{"class":1164},[1136,5894,5895],{"class":1342},"is_available",[1136,5897,2091],{"class":1164},[1136,5899,5900,5903,5905,5907,5909,5912,5914],{"class":1138,"line":2153},[1136,5901,5902],{"class":1342},"                item_data",[1136,5904,1274],{"class":1164},[1136,5906,2218],{"class":1277},[1136,5908,1165],{"class":1164},[1136,5910,5911],{"class":1342}," item_data",[1136,5913,1274],{"class":1164},[1136,5915,5916],{"class":1277},"quantity\n",[1136,5918,5919],{"class":1138,"line":2159},[1136,5920,5921],{"class":1164},"            ):\n",[1136,5923,5924,5926,5928,5930,5932,5935,5937,5939,5941,5943,5945,5947],{"class":1138,"line":2177},[1136,5925,5844],{"class":1149},[1136,5927,5847],{"class":1342},[1136,5929,1235],{"class":1164},[1136,5931,2922],{"class":1200},[1136,5933,5934],{"class":1318},"\"Insufficient inventory for ",[1136,5936,2929],{"class":2928},[1136,5938,3904],{"class":1342},[1136,5940,1274],{"class":1164},[1136,5942,3516],{"class":1277},[1136,5944,2934],{"class":2928},[1136,5946,1550],{"class":1318},[1136,5948,1439],{"class":1164},[1136,5950,5951],{"class":1138,"line":2193},[1136,5952,3439],{"class":1153},[1136,5954,5955],{"class":1138,"line":2206},[1136,5956,5957],{"class":1142},"            # Get current price\n",[1136,5959,5960,5963,5965,5967,5969,5971,5973,5976,5978,5980,5982,5984],{"class":1138,"line":2223},[1136,5961,5962],{"class":1153},"            current_price ",[1136,5964,1396],{"class":1164},[1136,5966,1337],{"class":1160},[1136,5968,1274],{"class":1164},[1136,5970,3749],{"class":1277},[1136,5972,1274],{"class":1164},[1136,5974,5975],{"class":1342},"get_price",[1136,5977,1235],{"class":1164},[1136,5979,5822],{"class":1342},[1136,5981,1274],{"class":1164},[1136,5983,2218],{"class":1277},[1136,5985,1439],{"class":1164},[1136,5987,5988],{"class":1138,"line":2239},[1136,5989,3439],{"class":1153},[1136,5991,5992],{"class":1138,"line":2254},[1136,5993,5994],{"class":1142},"            # Add to order\n",[1136,5996,5997,6000,6002,6005,6007,6009,6011,6013,6015,6017,6019,6021,6023,6026],{"class":1138,"line":2260},[1136,5998,5999],{"class":1153},"            order",[1136,6001,1274],{"class":1164},[1136,6003,6004],{"class":1342},"add_item",[1136,6006,1235],{"class":1164},[1136,6008,5822],{"class":1342},[1136,6010,1274],{"class":1164},[1136,6012,2218],{"class":1277},[1136,6014,1165],{"class":1164},[1136,6016,5911],{"class":1342},[1136,6018,1274],{"class":1164},[1136,6020,1421],{"class":1277},[1136,6022,1165],{"class":1164},[1136,6024,6025],{"class":1342}," current_price",[1136,6027,1439],{"class":1164},[1136,6029,6030],{"class":1138,"line":2265},[1136,6031,1874],{"class":1153},[1136,6033,6034],{"class":1138,"line":3171},[1136,6035,6036],{"class":1142},"        # Confirm order\n",[1136,6038,6039,6042,6044,6047],{"class":1138,"line":3185},[1136,6040,6041],{"class":1153},"        order",[1136,6043,1274],{"class":1164},[1136,6045,6046],{"class":1342},"confirm",[1136,6048,1346],{"class":1164},[1136,6050,6051],{"class":1138,"line":3210},[1136,6052,1874],{"class":1153},[1136,6054,6055],{"class":1138,"line":3220},[1136,6056,6057],{"class":1142},"        # Reserve inventory\n",[1136,6059,6060,6062,6064,6066,6068,6070,6072],{"class":1138,"line":3226},[1136,6061,2162],{"class":1149},[1136,6063,1427],{"class":1153},[1136,6065,1430],{"class":1149},[1136,6067,2045],{"class":1153},[1136,6069,1274],{"class":1164},[1136,6071,1294],{"class":1277},[1136,6073,1208],{"class":1164},[1136,6075,6076,6078,6080,6082,6084,6087,6089,6091,6093,6095,6097,6099,6101,6103],{"class":1138,"line":3249},[1136,6077,5363],{"class":1160},[1136,6079,1274],{"class":1164},[1136,6081,5674],{"class":1277},[1136,6083,1274],{"class":1164},[1136,6085,6086],{"class":1342},"reserve",[1136,6088,1235],{"class":1164},[1136,6090,1404],{"class":1342},[1136,6092,1274],{"class":1164},[1136,6094,2218],{"class":1277},[1136,6096,1165],{"class":1164},[1136,6098,1416],{"class":1342},[1136,6100,1274],{"class":1164},[1136,6102,1421],{"class":1277},[1136,6104,1439],{"class":1164},[1136,6106,6107],{"class":1138,"line":3264},[1136,6108,1874],{"class":1153},[1136,6110,6111],{"class":1138,"line":3269},[1136,6112,6113],{"class":1142},"        # Save aggregate\n",[1136,6115,6116,6119,6121,6123,6125,6127,6129,6131,6133,6135],{"class":1138,"line":3275},[1136,6117,6118],{"class":1153},"        order_id ",[1136,6120,1396],{"class":1164},[1136,6122,1337],{"class":1160},[1136,6124,1274],{"class":1164},[1136,6126,1756],{"class":1277},[1136,6128,1274],{"class":1164},[1136,6130,1940],{"class":1342},[1136,6132,1235],{"class":1164},[1136,6134,1945],{"class":1342},[1136,6136,1439],{"class":1164},[1136,6138,6140],{"class":1138,"line":6139},89,[1136,6141,1874],{"class":1153},[1136,6143,6145],{"class":1138,"line":6144},90,[1136,6146,6147],{"class":1142},"        # Publish domain events\n",[1136,6149,6151,6153,6155,6158],{"class":1138,"line":6150},91,[1136,6152,5535],{"class":1153},[1136,6154,1274],{"class":1164},[1136,6156,6157],{"class":1342},"publish_events",[1136,6159,1346],{"class":1164},[1136,6161,6163],{"class":1138,"line":6162},92,[1136,6164,1874],{"class":1153},[1136,6166,6168,6170],{"class":1138,"line":6167},93,[1136,6169,1476],{"class":1149},[1136,6171,6172],{"class":1153}," order_id\n",[1038,6174,6176],{"id":6175},"case-study-multi-tenant-saas-architecture","Case Study: Multi-Tenant SaaS Architecture",[1126,6178,6180],{"className":1128,"code":6179,"language":1130,"meta":1131,"style":1131},"# Tenant-aware architecture\nclass TenantMiddleware:\n    \"\"\"Middleware for multi-tenant request handling\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Extract tenant from subdomain or header\n        tenant = self._extract_tenant(request)\n        \n        # Set tenant context\n        TenantContext.set_current_tenant(tenant)\n        \n        try:\n            response = self.get_response(request)\n            return response\n        finally:\n            TenantContext.clear()\n    \n    def _extract_tenant(self, request):\n        # Extract from subdomain\n        host = request.get_host()\n        subdomain = host.split('.')[0]\n        \n        try:\n            return Tenant.objects.get(subdomain=subdomain)\n        except Tenant.DoesNotExist:\n            raise Http404(\"Tenant not found\")\n\nclass TenantAwareManager(models.Manager):\n    \"\"\"Manager that automatically filters by tenant\"\"\"\n    \n    def get_queryset(self):\n        queryset = super().get_queryset()\n        tenant = TenantContext.get_current_tenant()\n        \n        if tenant:\n            return queryset.filter(tenant=tenant)\n        \n        return queryset\n\nclass TenantAwareModel(models.Model):\n    \"\"\"Base model for tenant-aware entities\"\"\"\n    \n    tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE)\n    \n    objects = TenantAwareManager()\n    \n    class Meta:\n        abstract = True\n    \n    def save(self, *args, **kwargs):\n        if not self.tenant_id:\n            self.tenant = TenantContext.get_current_tenant()\n        super().save(*args, **kwargs)\n",[1133,6181,6182,6187,6196,6205,6209,6226,6240,6244,6261,6266,6286,6290,6295,6312,6316,6322,6341,6348,6355,6367,6371,6388,6393,6409,6440,6444,6450,6476,6489,6507,6511,6530,6539,6543,6556,6574,6590,6594,6603,6625,6629,6636,6640,6658,6667,6671,6707,6711,6722,6726,6736,6745,6749,6774,6789,6807],{"__ignoreMap":1131},[1136,6183,6184],{"class":1138,"line":1139},[1136,6185,6186],{"class":1142},"# Tenant-aware architecture\n",[1136,6188,6189,6191,6194],{"class":1138,"line":1146},[1136,6190,1201],{"class":1200},[1136,6192,6193],{"class":1204}," TenantMiddleware",[1136,6195,1208],{"class":1164},[1136,6197,6198,6200,6203],{"class":1138,"line":1171},[1136,6199,1215],{"class":1214},[1136,6201,6202],{"class":1218},"Middleware for multi-tenant request handling",[1136,6204,1222],{"class":1214},[1136,6206,6207],{"class":1138,"line":1184},[1136,6208,1352],{"class":1153},[1136,6210,6211,6213,6215,6217,6219,6221,6224],{"class":1138,"line":1191},[1136,6212,1228],{"class":1200},[1136,6214,1232],{"class":1231},[1136,6216,1235],{"class":1164},[1136,6218,1239],{"class":1238},[1136,6220,1165],{"class":1164},[1136,6222,6223],{"class":1244}," get_response",[1136,6225,1265],{"class":1164},[1136,6227,6228,6230,6232,6235,6237],{"class":1138,"line":1197},[1136,6229,1271],{"class":1160},[1136,6231,1274],{"class":1164},[1136,6233,6234],{"class":1277},"get_response",[1136,6236,1281],{"class":1164},[1136,6238,6239],{"class":1153}," get_response\n",[1136,6241,6242],{"class":1138,"line":1211},[1136,6243,1352],{"class":1153},[1136,6245,6246,6248,6251,6253,6255,6257,6259],{"class":1138,"line":1225},[1136,6247,1228],{"class":1200},[1136,6249,6250],{"class":1231}," __call__",[1136,6252,1235],{"class":1164},[1136,6254,1239],{"class":1238},[1136,6256,1165],{"class":1164},[1136,6258,3385],{"class":1244},[1136,6260,1265],{"class":1164},[1136,6262,6263],{"class":1138,"line":1268},[1136,6264,6265],{"class":1142},"        # Extract tenant from subdomain or header\n",[1136,6267,6268,6271,6273,6275,6277,6280,6282,6284],{"class":1138,"line":1287},[1136,6269,6270],{"class":1153},"        tenant ",[1136,6272,1396],{"class":1164},[1136,6274,1337],{"class":1160},[1136,6276,1274],{"class":1164},[1136,6278,6279],{"class":1342},"_extract_tenant",[1136,6281,1235],{"class":1164},[1136,6283,3427],{"class":1342},[1136,6285,1439],{"class":1164},[1136,6287,6288],{"class":1138,"line":1302},[1136,6289,1874],{"class":1153},[1136,6291,6292],{"class":1138,"line":1325},[1136,6293,6294],{"class":1142},"        # Set tenant context\n",[1136,6296,6297,6300,6302,6305,6307,6310],{"class":1138,"line":1349},[1136,6298,6299],{"class":1153},"        TenantContext",[1136,6301,1274],{"class":1164},[1136,6303,6304],{"class":1342},"set_current_tenant",[1136,6306,1235],{"class":1164},[1136,6308,6309],{"class":1342},"tenant",[1136,6311,1439],{"class":1164},[1136,6313,6314],{"class":1138,"line":1355},[1136,6315,1874],{"class":1153},[1136,6317,6318,6320],{"class":1138,"line":1379},[1136,6319,3401],{"class":1149},[1136,6321,1208],{"class":1164},[1136,6323,6324,6327,6329,6331,6333,6335,6337,6339],{"class":1138,"line":1390},[1136,6325,6326],{"class":1153},"            response ",[1136,6328,1396],{"class":1164},[1136,6330,1337],{"class":1160},[1136,6332,1274],{"class":1164},[1136,6334,6234],{"class":1342},[1136,6336,1235],{"class":1164},[1136,6338,3427],{"class":1342},[1136,6340,1439],{"class":1164},[1136,6342,6343,6345],{"class":1138,"line":1442},[1136,6344,3482],{"class":1149},[1136,6346,6347],{"class":1153}," response\n",[1136,6349,6350,6353],{"class":1138,"line":1473},[1136,6351,6352],{"class":1149},"        finally",[1136,6354,1208],{"class":1164},[1136,6356,6357,6360,6362,6365],{"class":1138,"line":1487},[1136,6358,6359],{"class":1153},"            TenantContext",[1136,6361,1274],{"class":1164},[1136,6363,6364],{"class":1342},"clear",[1136,6366,1346],{"class":1164},[1136,6368,6369],{"class":1138,"line":1492},[1136,6370,1352],{"class":1153},[1136,6372,6373,6375,6378,6380,6382,6384,6386],{"class":1138,"line":1506},[1136,6374,1228],{"class":1200},[1136,6376,6377],{"class":1360}," _extract_tenant",[1136,6379,1235],{"class":1164},[1136,6381,1239],{"class":1238},[1136,6383,1165],{"class":1164},[1136,6385,3385],{"class":1244},[1136,6387,1265],{"class":1164},[1136,6389,6390],{"class":1138,"line":1516},[1136,6391,6392],{"class":1142},"        # Extract from subdomain\n",[1136,6394,6395,6398,6400,6402,6404,6407],{"class":1138,"line":1539},[1136,6396,6397],{"class":1153},"        host ",[1136,6399,1396],{"class":1164},[1136,6401,3385],{"class":1153},[1136,6403,1274],{"class":1164},[1136,6405,6406],{"class":1342},"get_host",[1136,6408,1346],{"class":1164},[1136,6410,6411,6414,6416,6419,6421,6424,6426,6428,6430,6432,6435,6438],{"class":1138,"line":1560},[1136,6412,6413],{"class":1153},"        subdomain ",[1136,6415,1396],{"class":1164},[1136,6417,6418],{"class":1153}," host",[1136,6420,1274],{"class":1164},[1136,6422,6423],{"class":1342},"split",[1136,6425,1235],{"class":1164},[1136,6427,1460],{"class":1314},[1136,6429,1274],{"class":1318},[1136,6431,1460],{"class":1314},[1136,6433,6434],{"class":1164},")[",[1136,6436,6437],{"class":3558},"0",[1136,6439,1645],{"class":1164},[1136,6441,6442],{"class":1138,"line":1578},[1136,6443,1874],{"class":1153},[1136,6445,6446,6448],{"class":1138,"line":1583},[1136,6447,3401],{"class":1149},[1136,6449,1208],{"class":1164},[1136,6451,6452,6454,6457,6459,6461,6463,6465,6467,6470,6472,6474],{"class":1138,"line":1604},[1136,6453,3482],{"class":1149},[1136,6455,6456],{"class":1153}," Tenant",[1136,6458,1274],{"class":1164},[1136,6460,2083],{"class":1277},[1136,6462,1274],{"class":1164},[1136,6464,2893],{"class":1342},[1136,6466,1235],{"class":1164},[1136,6468,6469],{"class":2097},"subdomain",[1136,6471,1396],{"class":1164},[1136,6473,6469],{"class":1342},[1136,6475,1439],{"class":1164},[1136,6477,6478,6480,6482,6484,6487],{"class":1138,"line":1614},[1136,6479,3570],{"class":1149},[1136,6481,6456],{"class":1153},[1136,6483,1274],{"class":1164},[1136,6485,6486],{"class":1277},"DoesNotExist",[1136,6488,1208],{"class":1164},[1136,6490,6491,6493,6496,6498,6500,6503,6505],{"class":1138,"line":1648},[1136,6492,1542],{"class":1149},[1136,6494,6495],{"class":1342}," Http404",[1136,6497,1235],{"class":1164},[1136,6499,1550],{"class":1314},[1136,6501,6502],{"class":1318},"Tenant not found",[1136,6504,1550],{"class":1314},[1136,6506,1439],{"class":1164},[1136,6508,6509],{"class":1138,"line":1653},[1136,6510,1188],{"emptyLinePlaceholder":1187},[1136,6512,6513,6515,6518,6520,6523,6525,6528],{"class":1138,"line":1659},[1136,6514,1201],{"class":1200},[1136,6516,6517],{"class":1204}," TenantAwareManager",[1136,6519,1235],{"class":1164},[1136,6521,6522],{"class":2388},"models",[1136,6524,1274],{"class":1164},[1136,6526,6527],{"class":2388},"Manager",[1136,6529,1265],{"class":1164},[1136,6531,6532,6534,6537],{"class":1138,"line":1669},[1136,6533,1215],{"class":1214},[1136,6535,6536],{"class":1218},"Manager that automatically filters by tenant",[1136,6538,1222],{"class":1214},[1136,6540,6541],{"class":1138,"line":1679},[1136,6542,1352],{"class":1153},[1136,6544,6545,6547,6550,6552,6554],{"class":1138,"line":1684},[1136,6546,1228],{"class":1200},[1136,6548,6549],{"class":1360}," get_queryset",[1136,6551,1235],{"class":1164},[1136,6553,1239],{"class":1238},[1136,6555,1265],{"class":1164},[1136,6557,6558,6561,6563,6566,6569,6572],{"class":1138,"line":1714},[1136,6559,6560],{"class":1153},"        queryset ",[1136,6562,1396],{"class":1164},[1136,6564,6565],{"class":1251}," super",[1136,6567,6568],{"class":1164},"().",[1136,6570,6571],{"class":1342},"get_queryset",[1136,6573,1346],{"class":1164},[1136,6575,6576,6578,6580,6583,6585,6588],{"class":1138,"line":1732},[1136,6577,6270],{"class":1153},[1136,6579,1396],{"class":1164},[1136,6581,6582],{"class":1153}," TenantContext",[1136,6584,1274],{"class":1164},[1136,6586,6587],{"class":1342},"get_current_tenant",[1136,6589,1346],{"class":1164},[1136,6591,6592],{"class":1138,"line":1749},[1136,6593,1874],{"class":1153},[1136,6595,6596,6598,6601],{"class":1138,"line":1764},[1136,6597,1519],{"class":1149},[1136,6599,6600],{"class":1153}," tenant",[1136,6602,1208],{"class":1164},[1136,6604,6605,6607,6610,6612,6615,6617,6619,6621,6623],{"class":1138,"line":1779},[1136,6606,3482],{"class":1149},[1136,6608,6609],{"class":1153}," queryset",[1136,6611,1274],{"class":1164},[1136,6613,6614],{"class":1342},"filter",[1136,6616,1235],{"class":1164},[1136,6618,6309],{"class":2097},[1136,6620,1396],{"class":1164},[1136,6622,6309],{"class":1342},[1136,6624,1439],{"class":1164},[1136,6626,6627],{"class":1138,"line":1794},[1136,6628,1874],{"class":1153},[1136,6630,6631,6633],{"class":1138,"line":1799},[1136,6632,1476],{"class":1149},[1136,6634,6635],{"class":1153}," queryset\n",[1136,6637,6638],{"class":1138,"line":1835},[1136,6639,1188],{"emptyLinePlaceholder":1187},[1136,6641,6642,6644,6647,6649,6651,6653,6656],{"class":1138,"line":1845},[1136,6643,1201],{"class":1200},[1136,6645,6646],{"class":1204}," TenantAwareModel",[1136,6648,1235],{"class":1164},[1136,6650,6522],{"class":2388},[1136,6652,1274],{"class":1164},[1136,6654,6655],{"class":2388},"Model",[1136,6657,1265],{"class":1164},[1136,6659,6660,6662,6665],{"class":1138,"line":1851},[1136,6661,1215],{"class":1214},[1136,6663,6664],{"class":1218},"Base model for tenant-aware entities",[1136,6666,1222],{"class":1214},[1136,6668,6669],{"class":1138,"line":1871},[1136,6670,1352],{"class":1153},[1136,6672,6673,6676,6678,6681,6683,6686,6688,6691,6693,6696,6698,6700,6702,6705],{"class":1138,"line":1877},[1136,6674,6675],{"class":1153},"    tenant ",[1136,6677,1396],{"class":1164},[1136,6679,6680],{"class":1153}," models",[1136,6682,1274],{"class":1164},[1136,6684,6685],{"class":1342},"ForeignKey",[1136,6687,1235],{"class":1164},[1136,6689,6690],{"class":1342},"Tenant",[1136,6692,1165],{"class":1164},[1136,6694,6695],{"class":2097}," on_delete",[1136,6697,1396],{"class":1164},[1136,6699,6522],{"class":1342},[1136,6701,1274],{"class":1164},[1136,6703,6704],{"class":4878},"CASCADE",[1136,6706,1439],{"class":1164},[1136,6708,6709],{"class":1138,"line":1883},[1136,6710,1352],{"class":1153},[1136,6712,6713,6716,6718,6720],{"class":1138,"line":1895},[1136,6714,6715],{"class":1153},"    objects ",[1136,6717,1396],{"class":1164},[1136,6719,6517],{"class":1342},[1136,6721,1346],{"class":1164},[1136,6723,6724],{"class":1138,"line":1913},[1136,6725,1352],{"class":1153},[1136,6727,6728,6731,6734],{"class":1138,"line":1918},[1136,6729,6730],{"class":1200},"    class",[1136,6732,6733],{"class":1204}," Meta",[1136,6735,1208],{"class":1164},[1136,6737,6738,6741,6743],{"class":1138,"line":1924},[1136,6739,6740],{"class":1153},"        abstract ",[1136,6742,1396],{"class":1164},[1136,6744,4896],{"class":2465},[1136,6746,6747],{"class":1138,"line":1950},[1136,6748,1352],{"class":1153},[1136,6750,6751,6753,6755,6757,6759,6761,6763,6766,6768,6770,6772],{"class":1138,"line":1955},[1136,6752,1228],{"class":1200},[1136,6754,2036],{"class":1360},[1136,6756,1235],{"class":1164},[1136,6758,1239],{"class":1238},[1136,6760,1165],{"class":1164},[1136,6762,1413],{"class":1412},[1136,6764,6765],{"class":1244},"args",[1136,6767,1165],{"class":1164},[1136,6769,3076],{"class":1412},[1136,6771,3079],{"class":1244},[1136,6773,1265],{"class":1164},[1136,6775,6776,6778,6780,6782,6784,6787],{"class":1138,"line":1961},[1136,6777,1519],{"class":1149},[1136,6779,1888],{"class":1412},[1136,6781,1337],{"class":1160},[1136,6783,1274],{"class":1164},[1136,6785,6786],{"class":1277},"tenant_id",[1136,6788,1208],{"class":1164},[1136,6790,6791,6793,6795,6797,6799,6801,6803,6805],{"class":1138,"line":1982},[1136,6792,5363],{"class":1160},[1136,6794,1274],{"class":1164},[1136,6796,6309],{"class":1277},[1136,6798,1281],{"class":1164},[1136,6800,6582],{"class":1153},[1136,6802,1274],{"class":1164},[1136,6804,6587],{"class":1342},[1136,6806,1346],{"class":1164},[1136,6808,6809,6812,6814,6816,6818,6820,6822,6824,6826,6828],{"class":1138,"line":1987},[1136,6810,6811],{"class":1251},"        super",[1136,6813,6568],{"class":1164},[1136,6815,1940],{"class":1342},[1136,6817,1235],{"class":1164},[1136,6819,1453],{"class":1412},[1136,6821,6765],{"class":1342},[1136,6823,1165],{"class":1164},[1136,6825,3076],{"class":1412},[1136,6827,3079],{"class":1342},[1136,6829,1439],{"class":1164},[1030,6831,6833],{"id":6832},"performance-at-scale","Performance at Scale",[1038,6835,6837],{"id":6836},"advanced-caching-patterns","Advanced Caching Patterns",[1126,6839,6841],{"className":1128,"code":6840,"language":1130,"meta":1131,"style":1131},"# Multi-level caching with cache warming\nclass CacheWarmer:\n    \"\"\"Intelligent cache warming system\"\"\"\n    \n    def __init__(self):\n        self.cache_strategies = {}\n    \n    def register_strategy(self, key_pattern: str, strategy: CacheStrategy):\n        \"\"\"Register cache warming strategy\"\"\"\n        self.cache_strategies[key_pattern] = strategy\n    \n    def warm_cache(self, patterns: list = None):\n        \"\"\"Warm caches based on strategies\"\"\"\n        patterns = patterns or self.cache_strategies.keys()\n        \n        for pattern in patterns:\n            strategy = self.cache_strategies.get(pattern)\n            if strategy:\n                strategy.warm()\n\nclass ProductCacheStrategy(CacheStrategy):\n    \"\"\"Cache warming strategy for products\"\"\"\n    \n    def warm(self):\n        \"\"\"Warm product-related caches\"\"\"\n        # Warm popular products\n        popular_products = Product.objects.filter(\n            is_popular=True\n        ).select_related('category')\n        \n        for product in popular_products:\n            cache_key = f\"product:{product.id}\"\n            cache.set(cache_key, product, 3600)\n        \n        # Warm category navigation\n        categories = Category.objects.filter(is_active=True)\n        cache.set('categories:navigation', categories, 7200)\n\n# Database connection pooling\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': 'myapp',\n        'USER': 'myuser',\n        'PASSWORD': 'mypass',\n        'HOST': 'localhost',\n        'PORT': '5432',\n        'OPTIONS': {\n            'MAX_CONNS': 20,\n            'MIN_CONNS': 5,\n        },\n        'CONN_MAX_AGE': 600,  # 10 minutes\n    }\n}\n",[1133,6842,6843,6848,6857,6866,6870,6882,6896,6900,6931,6940,6960,6964,6991,7000,7026,7030,7043,7067,7075,7087,7091,7105,7114,7118,7131,7140,7145,7164,7174,7193,7197,7211,7236,7262,7266,7271,7301,7331,7335,7340,7349,7363,7383,7403,7423,7443,7463,7483,7496,7512,7528,7533,7552,7556],{"__ignoreMap":1131},[1136,6844,6845],{"class":1138,"line":1139},[1136,6846,6847],{"class":1142},"# Multi-level caching with cache warming\n",[1136,6849,6850,6852,6855],{"class":1138,"line":1146},[1136,6851,1201],{"class":1200},[1136,6853,6854],{"class":1204}," CacheWarmer",[1136,6856,1208],{"class":1164},[1136,6858,6859,6861,6864],{"class":1138,"line":1171},[1136,6860,1215],{"class":1214},[1136,6862,6863],{"class":1218},"Intelligent cache warming system",[1136,6865,1222],{"class":1214},[1136,6867,6868],{"class":1138,"line":1184},[1136,6869,1352],{"class":1153},[1136,6871,6872,6874,6876,6878,6880],{"class":1138,"line":1191},[1136,6873,1228],{"class":1200},[1136,6875,1232],{"class":1231},[1136,6877,1235],{"class":1164},[1136,6879,1239],{"class":1238},[1136,6881,1265],{"class":1164},[1136,6883,6884,6886,6888,6891,6893],{"class":1138,"line":1197},[1136,6885,1271],{"class":1160},[1136,6887,1274],{"class":1164},[1136,6889,6890],{"class":1277},"cache_strategies",[1136,6892,1281],{"class":1164},[1136,6894,6895],{"class":1164}," {}\n",[1136,6897,6898],{"class":1138,"line":1211},[1136,6899,1352],{"class":1153},[1136,6901,6902,6904,6907,6909,6911,6913,6916,6918,6920,6922,6924,6926,6929],{"class":1138,"line":1225},[1136,6903,1228],{"class":1200},[1136,6905,6906],{"class":1360}," register_strategy",[1136,6908,1235],{"class":1164},[1136,6910,1239],{"class":1238},[1136,6912,1165],{"class":1164},[1136,6914,6915],{"class":1244}," key_pattern",[1136,6917,1248],{"class":1164},[1136,6919,2865],{"class":1251},[1136,6921,1165],{"class":1164},[1136,6923,2672],{"class":1244},[1136,6925,1248],{"class":1164},[1136,6927,6928],{"class":1153}," CacheStrategy",[1136,6930,1265],{"class":1164},[1136,6932,6933,6935,6938],{"class":1138,"line":1268},[1136,6934,1382],{"class":1214},[1136,6936,6937],{"class":1218},"Register cache warming strategy",[1136,6939,1222],{"class":1214},[1136,6941,6942,6944,6946,6948,6950,6953,6956,6958],{"class":1138,"line":1287},[1136,6943,1271],{"class":1160},[1136,6945,1274],{"class":1164},[1136,6947,6890],{"class":1277},[1136,6949,3822],{"class":1164},[1136,6951,6952],{"class":1277},"key_pattern",[1136,6954,6955],{"class":1164},"]",[1136,6957,1281],{"class":1164},[1136,6959,2692],{"class":1153},[1136,6961,6962],{"class":1138,"line":1302},[1136,6963,1352],{"class":1153},[1136,6965,6966,6968,6971,6973,6975,6977,6980,6982,6984,6986,6989],{"class":1138,"line":1325},[1136,6967,1228],{"class":1200},[1136,6969,6970],{"class":1360}," warm_cache",[1136,6972,1235],{"class":1164},[1136,6974,1239],{"class":1238},[1136,6976,1165],{"class":1164},[1136,6978,6979],{"class":1244}," patterns",[1136,6981,1248],{"class":1164},[1136,6983,1262],{"class":1251},[1136,6985,1281],{"class":1164},[1136,6987,6988],{"class":2465}," None",[1136,6990,1265],{"class":1164},[1136,6992,6993,6995,6998],{"class":1138,"line":1349},[1136,6994,1382],{"class":1214},[1136,6996,6997],{"class":1218},"Warm caches based on strategies",[1136,6999,1222],{"class":1214},[1136,7001,7002,7005,7007,7010,7013,7015,7017,7019,7021,7024],{"class":1138,"line":1355},[1136,7003,7004],{"class":1153},"        patterns ",[1136,7006,1396],{"class":1164},[1136,7008,7009],{"class":1153}," patterns ",[1136,7011,7012],{"class":1412},"or",[1136,7014,1337],{"class":1160},[1136,7016,1274],{"class":1164},[1136,7018,6890],{"class":1277},[1136,7020,1274],{"class":1164},[1136,7022,7023],{"class":1342},"keys",[1136,7025,1346],{"class":1164},[1136,7027,7028],{"class":1138,"line":1379},[1136,7029,1874],{"class":1153},[1136,7031,7032,7034,7037,7039,7041],{"class":1138,"line":1390},[1136,7033,2162],{"class":1149},[1136,7035,7036],{"class":1153}," pattern ",[1136,7038,1430],{"class":1149},[1136,7040,6979],{"class":1153},[1136,7042,1208],{"class":1164},[1136,7044,7045,7048,7050,7052,7054,7056,7058,7060,7062,7065],{"class":1138,"line":1442},[1136,7046,7047],{"class":1153},"            strategy ",[1136,7049,1396],{"class":1164},[1136,7051,1337],{"class":1160},[1136,7053,1274],{"class":1164},[1136,7055,6890],{"class":1277},[1136,7057,1274],{"class":1164},[1136,7059,2893],{"class":1342},[1136,7061,1235],{"class":1164},[1136,7063,7064],{"class":1342},"pattern",[1136,7066,1439],{"class":1164},[1136,7068,7069,7071,7073],{"class":1138,"line":1473},[1136,7070,5833],{"class":1149},[1136,7072,2672],{"class":1153},[1136,7074,1208],{"class":1164},[1136,7076,7077,7080,7082,7085],{"class":1138,"line":1487},[1136,7078,7079],{"class":1153},"                strategy",[1136,7081,1274],{"class":1164},[1136,7083,7084],{"class":1342},"warm",[1136,7086,1346],{"class":1164},[1136,7088,7089],{"class":1138,"line":1492},[1136,7090,1188],{"emptyLinePlaceholder":1187},[1136,7092,7093,7095,7098,7100,7103],{"class":1138,"line":1506},[1136,7094,1201],{"class":1200},[1136,7096,7097],{"class":1204}," ProductCacheStrategy",[1136,7099,1235],{"class":1164},[1136,7101,7102],{"class":2388},"CacheStrategy",[1136,7104,1265],{"class":1164},[1136,7106,7107,7109,7112],{"class":1138,"line":1516},[1136,7108,1215],{"class":1214},[1136,7110,7111],{"class":1218},"Cache warming strategy for products",[1136,7113,1222],{"class":1214},[1136,7115,7116],{"class":1138,"line":1539},[1136,7117,1352],{"class":1153},[1136,7119,7120,7122,7125,7127,7129],{"class":1138,"line":1560},[1136,7121,1228],{"class":1200},[1136,7123,7124],{"class":1360}," warm",[1136,7126,1235],{"class":1164},[1136,7128,1239],{"class":1238},[1136,7130,1265],{"class":1164},[1136,7132,7133,7135,7138],{"class":1138,"line":1578},[1136,7134,1382],{"class":1214},[1136,7136,7137],{"class":1218},"Warm product-related caches",[1136,7139,1222],{"class":1214},[1136,7141,7142],{"class":1138,"line":1583},[1136,7143,7144],{"class":1142},"        # Warm popular products\n",[1136,7146,7147,7150,7152,7154,7156,7158,7160,7162],{"class":1138,"line":1604},[1136,7148,7149],{"class":1153},"        popular_products ",[1136,7151,1396],{"class":1164},[1136,7153,3784],{"class":1153},[1136,7155,1274],{"class":1164},[1136,7157,2083],{"class":1277},[1136,7159,1274],{"class":1164},[1136,7161,6614],{"class":1342},[1136,7163,2091],{"class":1164},[1136,7165,7166,7169,7171],{"class":1138,"line":1614},[1136,7167,7168],{"class":2097},"            is_popular",[1136,7170,1396],{"class":1164},[1136,7172,7173],{"class":2465},"True\n",[1136,7175,7176,7179,7182,7184,7186,7189,7191],{"class":1138,"line":1648},[1136,7177,7178],{"class":1164},"        ).",[1136,7180,7181],{"class":1342},"select_related",[1136,7183,1235],{"class":1164},[1136,7185,1460],{"class":1314},[1136,7187,7188],{"class":1318},"category",[1136,7190,1460],{"class":1314},[1136,7192,1439],{"class":1164},[1136,7194,7195],{"class":1138,"line":1653},[1136,7196,1874],{"class":1153},[1136,7198,7199,7201,7204,7206,7209],{"class":1138,"line":1659},[1136,7200,2162],{"class":1149},[1136,7202,7203],{"class":1153}," product ",[1136,7205,1430],{"class":1149},[1136,7207,7208],{"class":1153}," popular_products",[1136,7210,1208],{"class":1164},[1136,7212,7213,7216,7218,7221,7224,7226,7228,7230,7232,7234],{"class":1138,"line":1669},[1136,7214,7215],{"class":1153},"            cache_key ",[1136,7217,1396],{"class":1164},[1136,7219,7220],{"class":1200}," f",[1136,7222,7223],{"class":1318},"\"product:",[1136,7225,2929],{"class":2928},[1136,7227,3904],{"class":1153},[1136,7229,1274],{"class":1164},[1136,7231,3496],{"class":1277},[1136,7233,2934],{"class":2928},[1136,7235,4703],{"class":1318},[1136,7237,7238,7241,7243,7246,7248,7251,7253,7255,7257,7260],{"class":1138,"line":1679},[1136,7239,7240],{"class":1153},"            cache",[1136,7242,1274],{"class":1164},[1136,7244,7245],{"class":1342},"set",[1136,7247,1235],{"class":1164},[1136,7249,7250],{"class":1342},"cache_key",[1136,7252,1165],{"class":1164},[1136,7254,3503],{"class":1342},[1136,7256,1165],{"class":1164},[1136,7258,7259],{"class":3558}," 3600",[1136,7261,1439],{"class":1164},[1136,7263,7264],{"class":1138,"line":1684},[1136,7265,1874],{"class":1153},[1136,7267,7268],{"class":1138,"line":1714},[1136,7269,7270],{"class":1142},"        # Warm category navigation\n",[1136,7272,7273,7276,7278,7281,7283,7285,7287,7289,7291,7294,7296,7299],{"class":1138,"line":1732},[1136,7274,7275],{"class":1153},"        categories ",[1136,7277,1396],{"class":1164},[1136,7279,7280],{"class":1153}," Category",[1136,7282,1274],{"class":1164},[1136,7284,2083],{"class":1277},[1136,7286,1274],{"class":1164},[1136,7288,6614],{"class":1342},[1136,7290,1235],{"class":1164},[1136,7292,7293],{"class":2097},"is_active",[1136,7295,1396],{"class":1164},[1136,7297,7298],{"class":2465},"True",[1136,7300,1439],{"class":1164},[1136,7302,7303,7306,7308,7310,7312,7314,7317,7319,7321,7324,7326,7329],{"class":1138,"line":1749},[1136,7304,7305],{"class":1153},"        cache",[1136,7307,1274],{"class":1164},[1136,7309,7245],{"class":1342},[1136,7311,1235],{"class":1164},[1136,7313,1460],{"class":1314},[1136,7315,7316],{"class":1318},"categories:navigation",[1136,7318,1460],{"class":1314},[1136,7320,1165],{"class":1164},[1136,7322,7323],{"class":1342}," categories",[1136,7325,1165],{"class":1164},[1136,7327,7328],{"class":3558}," 7200",[1136,7330,1439],{"class":1164},[1136,7332,7333],{"class":1138,"line":1764},[1136,7334,1188],{"emptyLinePlaceholder":1187},[1136,7336,7337],{"class":1138,"line":1779},[1136,7338,7339],{"class":1142},"# Database connection pooling\n",[1136,7341,7342,7345,7347],{"class":1138,"line":1794},[1136,7343,7344],{"class":1160},"DATABASES",[1136,7346,1281],{"class":1164},[1136,7348,2450],{"class":1164},[1136,7350,7351,7354,7357,7359,7361],{"class":1138,"line":1799},[1136,7352,7353],{"class":1314},"    '",[1136,7355,7356],{"class":1318},"default",[1136,7358,1460],{"class":1314},[1136,7360,1248],{"class":1164},[1136,7362,2450],{"class":1164},[1136,7364,7365,7367,7370,7372,7374,7376,7379,7381],{"class":1138,"line":1835},[1136,7366,2801],{"class":1314},[1136,7368,7369],{"class":1318},"ENGINE",[1136,7371,1460],{"class":1314},[1136,7373,1248],{"class":1164},[1136,7375,1315],{"class":1314},[1136,7377,7378],{"class":1318},"django.db.backends.postgresql",[1136,7380,1460],{"class":1314},[1136,7382,1729],{"class":1164},[1136,7384,7385,7387,7390,7392,7394,7396,7399,7401],{"class":1138,"line":1845},[1136,7386,2801],{"class":1314},[1136,7388,7389],{"class":1318},"NAME",[1136,7391,1460],{"class":1314},[1136,7393,1248],{"class":1164},[1136,7395,1315],{"class":1314},[1136,7397,7398],{"class":1318},"myapp",[1136,7400,1460],{"class":1314},[1136,7402,1729],{"class":1164},[1136,7404,7405,7407,7410,7412,7414,7416,7419,7421],{"class":1138,"line":1851},[1136,7406,2801],{"class":1314},[1136,7408,7409],{"class":1318},"USER",[1136,7411,1460],{"class":1314},[1136,7413,1248],{"class":1164},[1136,7415,1315],{"class":1314},[1136,7417,7418],{"class":1318},"myuser",[1136,7420,1460],{"class":1314},[1136,7422,1729],{"class":1164},[1136,7424,7425,7427,7430,7432,7434,7436,7439,7441],{"class":1138,"line":1871},[1136,7426,2801],{"class":1314},[1136,7428,7429],{"class":1318},"PASSWORD",[1136,7431,1460],{"class":1314},[1136,7433,1248],{"class":1164},[1136,7435,1315],{"class":1314},[1136,7437,7438],{"class":1318},"mypass",[1136,7440,1460],{"class":1314},[1136,7442,1729],{"class":1164},[1136,7444,7445,7447,7450,7452,7454,7456,7459,7461],{"class":1138,"line":1877},[1136,7446,2801],{"class":1314},[1136,7448,7449],{"class":1318},"HOST",[1136,7451,1460],{"class":1314},[1136,7453,1248],{"class":1164},[1136,7455,1315],{"class":1314},[1136,7457,7458],{"class":1318},"localhost",[1136,7460,1460],{"class":1314},[1136,7462,1729],{"class":1164},[1136,7464,7465,7467,7470,7472,7474,7476,7479,7481],{"class":1138,"line":1883},[1136,7466,2801],{"class":1314},[1136,7468,7469],{"class":1318},"PORT",[1136,7471,1460],{"class":1314},[1136,7473,1248],{"class":1164},[1136,7475,1315],{"class":1314},[1136,7477,7478],{"class":1318},"5432",[1136,7480,1460],{"class":1314},[1136,7482,1729],{"class":1164},[1136,7484,7485,7487,7490,7492,7494],{"class":1138,"line":1895},[1136,7486,2801],{"class":1314},[1136,7488,7489],{"class":1318},"OPTIONS",[1136,7491,1460],{"class":1314},[1136,7493,1248],{"class":1164},[1136,7495,2450],{"class":1164},[1136,7497,7498,7500,7503,7505,7507,7510],{"class":1138,"line":1913},[1136,7499,2455],{"class":1314},[1136,7501,7502],{"class":1318},"MAX_CONNS",[1136,7504,1460],{"class":1314},[1136,7506,1248],{"class":1164},[1136,7508,7509],{"class":3558}," 20",[1136,7511,1729],{"class":1164},[1136,7513,7514,7516,7519,7521,7523,7526],{"class":1138,"line":1918},[1136,7515,2455],{"class":1314},[1136,7517,7518],{"class":1318},"MIN_CONNS",[1136,7520,1460],{"class":1314},[1136,7522,1248],{"class":1164},[1136,7524,7525],{"class":3558}," 5",[1136,7527,1729],{"class":1164},[1136,7529,7530],{"class":1138,"line":1924},[1136,7531,7532],{"class":1164},"        },\n",[1136,7534,7535,7537,7540,7542,7544,7547,7549],{"class":1138,"line":1950},[1136,7536,2801],{"class":1314},[1136,7538,7539],{"class":1318},"CONN_MAX_AGE",[1136,7541,1460],{"class":1314},[1136,7543,1248],{"class":1164},[1136,7545,7546],{"class":3558}," 600",[1136,7548,1165],{"class":1164},[1136,7550,7551],{"class":1142},"  # 10 minutes\n",[1136,7553,7554],{"class":1138,"line":1955},[1136,7555,2832],{"class":1164},[1136,7557,7558],{"class":1138,"line":1961},[1136,7559,7560],{"class":1164},"}\n",[1030,7562,7564],{"id":7563},"testing-advanced-architectures","Testing Advanced Architectures",[1126,7566,7568],{"className":1128,"code":7567,"language":1130,"meta":1131,"style":1131},"# Testing domain models\nclass TestOrderAggregate:\n    \"\"\"Test order aggregate business logic\"\"\"\n    \n    def test_add_item_to_draft_order(self):\n        \"\"\"Should add item to draft order\"\"\"\n        order = OrderAggregate(customer_id=1)\n        \n        order.add_item(product_id=1, quantity=2, price=Decimal('10.00'))\n        \n        assert len(order.items) == 1\n        assert order.total == Decimal('20.00')\n    \n    def test_cannot_add_item_to_confirmed_order(self):\n        \"\"\"Should not allow adding items to confirmed order\"\"\"\n        order = OrderAggregate(customer_id=1)\n        order.add_item(product_id=1, quantity=1, price=Decimal('10.00'))\n        order.confirm()\n        \n        with pytest.raises(DomainError):\n            order.add_item(product_id=2, quantity=1, price=Decimal('5.00'))\n\n# Testing application services\nclass TestOrderApplicationService:\n    \"\"\"Test order application service\"\"\"\n    \n    def test_place_order_success(self, mock_repos):\n        \"\"\"Should place order successfully\"\"\"\n        # Arrange\n        service = OrderApplicationService(\n            order_repo=mock_repos.order_repo,\n            product_repo=mock_repos.product_repo,\n            inventory_service=mock_repos.inventory_service,\n            pricing_service=mock_repos.pricing_service\n        )\n        \n        command = PlaceOrderCommand(\n            customer_id=1,\n            items=[OrderItemData(product_id=1, quantity=2)]\n        )\n        \n        # Act\n        order_id = service.place_order(command)\n        \n        # Assert\n        assert order_id is not None\n        mock_repos.order_repo.save.assert_called_once()\n        mock_repos.inventory_service.reserve.assert_called_once()\n",[1133,7569,7570,7575,7584,7593,7597,7610,7619,7638,7642,7687,7691,7714,7739,7743,7756,7765,7783,7825,7835,7839,7859,7902,7906,7911,7920,7929,7933,7951,7960,7965,7976,7992,8007,8022,8036,8040,8044,8055,8065,8095,8099,8103,8108,8128,8132,8137,8152,8172],{"__ignoreMap":1131},[1136,7571,7572],{"class":1138,"line":1139},[1136,7573,7574],{"class":1142},"# Testing domain models\n",[1136,7576,7577,7579,7582],{"class":1138,"line":1146},[1136,7578,1201],{"class":1200},[1136,7580,7581],{"class":1204}," TestOrderAggregate",[1136,7583,1208],{"class":1164},[1136,7585,7586,7588,7591],{"class":1138,"line":1171},[1136,7587,1215],{"class":1214},[1136,7589,7590],{"class":1218},"Test order aggregate business logic",[1136,7592,1222],{"class":1214},[1136,7594,7595],{"class":1138,"line":1184},[1136,7596,1352],{"class":1153},[1136,7598,7599,7601,7604,7606,7608],{"class":1138,"line":1191},[1136,7600,1228],{"class":1200},[1136,7602,7603],{"class":1360}," test_add_item_to_draft_order",[1136,7605,1235],{"class":1164},[1136,7607,1239],{"class":1238},[1136,7609,1265],{"class":1164},[1136,7611,7612,7614,7617],{"class":1138,"line":1197},[1136,7613,1382],{"class":1214},[1136,7615,7616],{"class":1218},"Should add item to draft order",[1136,7618,1222],{"class":1214},[1136,7620,7621,7623,7625,7627,7629,7631,7633,7636],{"class":1138,"line":1211},[1136,7622,1854],{"class":1153},[1136,7624,1396],{"class":1164},[1136,7626,5070],{"class":1342},[1136,7628,1235],{"class":1164},[1136,7630,1278],{"class":2097},[1136,7632,1396],{"class":1164},[1136,7634,7635],{"class":3558},"1",[1136,7637,1439],{"class":1164},[1136,7639,7640],{"class":1138,"line":1225},[1136,7641,1874],{"class":1153},[1136,7643,7644,7646,7648,7650,7652,7654,7656,7658,7660,7662,7664,7667,7669,7671,7673,7676,7678,7680,7683,7685],{"class":1138,"line":1268},[1136,7645,6041],{"class":1153},[1136,7647,1274],{"class":1164},[1136,7649,6004],{"class":1342},[1136,7651,1235],{"class":1164},[1136,7653,2218],{"class":2097},[1136,7655,1396],{"class":1164},[1136,7657,7635],{"class":3558},[1136,7659,1165],{"class":1164},[1136,7661,5200],{"class":2097},[1136,7663,1396],{"class":1164},[1136,7665,7666],{"class":3558},"2",[1136,7668,1165],{"class":1164},[1136,7670,5209],{"class":2097},[1136,7672,1396],{"class":1164},[1136,7674,7675],{"class":1342},"Decimal",[1136,7677,1235],{"class":1164},[1136,7679,1460],{"class":1314},[1136,7681,7682],{"class":1318},"10.00",[1136,7684,1460],{"class":1314},[1136,7686,5392],{"class":1164},[1136,7688,7689],{"class":1138,"line":1287},[1136,7690,1874],{"class":1153},[1136,7692,7693,7696,7699,7701,7703,7705,7707,7709,7711],{"class":1138,"line":1302},[1136,7694,7695],{"class":1149},"        assert",[1136,7697,7698],{"class":1231}," len",[1136,7700,1235],{"class":1164},[1136,7702,1945],{"class":1342},[1136,7704,1274],{"class":1164},[1136,7706,1294],{"class":1277},[1136,7708,1368],{"class":1164},[1136,7710,4308],{"class":1412},[1136,7712,7713],{"class":3558}," 1\n",[1136,7715,7716,7718,7720,7722,7724,7726,7728,7730,7732,7735,7737],{"class":1138,"line":1325},[1136,7717,7695],{"class":1149},[1136,7719,2045],{"class":1153},[1136,7721,1274],{"class":1164},[1136,7723,1332],{"class":1277},[1136,7725,4308],{"class":1412},[1136,7727,1374],{"class":1342},[1136,7729,1235],{"class":1164},[1136,7731,1460],{"class":1314},[1136,7733,7734],{"class":1318},"20.00",[1136,7736,1460],{"class":1314},[1136,7738,1439],{"class":1164},[1136,7740,7741],{"class":1138,"line":1349},[1136,7742,1352],{"class":1153},[1136,7744,7745,7747,7750,7752,7754],{"class":1138,"line":1355},[1136,7746,1228],{"class":1200},[1136,7748,7749],{"class":1360}," test_cannot_add_item_to_confirmed_order",[1136,7751,1235],{"class":1164},[1136,7753,1239],{"class":1238},[1136,7755,1265],{"class":1164},[1136,7757,7758,7760,7763],{"class":1138,"line":1379},[1136,7759,1382],{"class":1214},[1136,7761,7762],{"class":1218},"Should not allow adding items to confirmed order",[1136,7764,1222],{"class":1214},[1136,7766,7767,7769,7771,7773,7775,7777,7779,7781],{"class":1138,"line":1390},[1136,7768,1854],{"class":1153},[1136,7770,1396],{"class":1164},[1136,7772,5070],{"class":1342},[1136,7774,1235],{"class":1164},[1136,7776,1278],{"class":2097},[1136,7778,1396],{"class":1164},[1136,7780,7635],{"class":3558},[1136,7782,1439],{"class":1164},[1136,7784,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823],{"class":1138,"line":1442},[1136,7786,6041],{"class":1153},[1136,7788,1274],{"class":1164},[1136,7790,6004],{"class":1342},[1136,7792,1235],{"class":1164},[1136,7794,2218],{"class":2097},[1136,7796,1396],{"class":1164},[1136,7798,7635],{"class":3558},[1136,7800,1165],{"class":1164},[1136,7802,5200],{"class":2097},[1136,7804,1396],{"class":1164},[1136,7806,7635],{"class":3558},[1136,7808,1165],{"class":1164},[1136,7810,5209],{"class":2097},[1136,7812,1396],{"class":1164},[1136,7814,7675],{"class":1342},[1136,7816,1235],{"class":1164},[1136,7818,1460],{"class":1314},[1136,7820,7682],{"class":1318},[1136,7822,1460],{"class":1314},[1136,7824,5392],{"class":1164},[1136,7826,7827,7829,7831,7833],{"class":1138,"line":1473},[1136,7828,6041],{"class":1153},[1136,7830,1274],{"class":1164},[1136,7832,6046],{"class":1342},[1136,7834,1346],{"class":1164},[1136,7836,7837],{"class":1138,"line":1487},[1136,7838,1874],{"class":1153},[1136,7840,7841,7844,7847,7849,7852,7854,7857],{"class":1138,"line":1492},[1136,7842,7843],{"class":1149},"        with",[1136,7845,7846],{"class":1153}," pytest",[1136,7848,1274],{"class":1164},[1136,7850,7851],{"class":1342},"raises",[1136,7853,1235],{"class":1164},[1136,7855,7856],{"class":1342},"DomainError",[1136,7858,1265],{"class":1164},[1136,7860,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7898,7900],{"class":1138,"line":1506},[1136,7862,5999],{"class":1153},[1136,7864,1274],{"class":1164},[1136,7866,6004],{"class":1342},[1136,7868,1235],{"class":1164},[1136,7870,2218],{"class":2097},[1136,7872,1396],{"class":1164},[1136,7874,7666],{"class":3558},[1136,7876,1165],{"class":1164},[1136,7878,5200],{"class":2097},[1136,7880,1396],{"class":1164},[1136,7882,7635],{"class":3558},[1136,7884,1165],{"class":1164},[1136,7886,5209],{"class":2097},[1136,7888,1396],{"class":1164},[1136,7890,7675],{"class":1342},[1136,7892,1235],{"class":1164},[1136,7894,1460],{"class":1314},[1136,7896,7897],{"class":1318},"5.00",[1136,7899,1460],{"class":1314},[1136,7901,5392],{"class":1164},[1136,7903,7904],{"class":1138,"line":1516},[1136,7905,1188],{"emptyLinePlaceholder":1187},[1136,7907,7908],{"class":1138,"line":1539},[1136,7909,7910],{"class":1142},"# Testing application services\n",[1136,7912,7913,7915,7918],{"class":1138,"line":1560},[1136,7914,1201],{"class":1200},[1136,7916,7917],{"class":1204}," TestOrderApplicationService",[1136,7919,1208],{"class":1164},[1136,7921,7922,7924,7927],{"class":1138,"line":1578},[1136,7923,1215],{"class":1214},[1136,7925,7926],{"class":1218},"Test order application service",[1136,7928,1222],{"class":1214},[1136,7930,7931],{"class":1138,"line":1583},[1136,7932,1352],{"class":1153},[1136,7934,7935,7937,7940,7942,7944,7946,7949],{"class":1138,"line":1604},[1136,7936,1228],{"class":1200},[1136,7938,7939],{"class":1360}," test_place_order_success",[1136,7941,1235],{"class":1164},[1136,7943,1239],{"class":1238},[1136,7945,1165],{"class":1164},[1136,7947,7948],{"class":1244}," mock_repos",[1136,7950,1265],{"class":1164},[1136,7952,7953,7955,7958],{"class":1138,"line":1614},[1136,7954,1382],{"class":1214},[1136,7956,7957],{"class":1218},"Should place order successfully",[1136,7959,1222],{"class":1214},[1136,7961,7962],{"class":1138,"line":1648},[1136,7963,7964],{"class":1142},"        # Arrange\n",[1136,7966,7967,7970,7972,7974],{"class":1138,"line":1653},[1136,7968,7969],{"class":1153},"        service ",[1136,7971,1396],{"class":1164},[1136,7973,5567],{"class":1342},[1136,7975,2091],{"class":1164},[1136,7977,7978,7981,7983,7986,7988,7990],{"class":1138,"line":1659},[1136,7979,7980],{"class":2097},"            order_repo",[1136,7982,1396],{"class":1164},[1136,7984,7985],{"class":1342},"mock_repos",[1136,7987,1274],{"class":1164},[1136,7989,1756],{"class":1277},[1136,7991,1729],{"class":1164},[1136,7993,7994,7997,7999,8001,8003,8005],{"class":1138,"line":1669},[1136,7995,7996],{"class":2097},"            product_repo",[1136,7998,1396],{"class":1164},[1136,8000,7985],{"class":1342},[1136,8002,1274],{"class":1164},[1136,8004,3735],{"class":1277},[1136,8006,1729],{"class":1164},[1136,8008,8009,8012,8014,8016,8018,8020],{"class":1138,"line":1679},[1136,8010,8011],{"class":2097},"            inventory_service",[1136,8013,1396],{"class":1164},[1136,8015,7985],{"class":1342},[1136,8017,1274],{"class":1164},[1136,8019,5674],{"class":1277},[1136,8021,1729],{"class":1164},[1136,8023,8024,8027,8029,8031,8033],{"class":1138,"line":1684},[1136,8025,8026],{"class":2097},"            pricing_service",[1136,8028,1396],{"class":1164},[1136,8030,7985],{"class":1342},[1136,8032,1274],{"class":1164},[1136,8034,8035],{"class":1277},"pricing_service\n",[1136,8037,8038],{"class":1138,"line":1714},[1136,8039,2145],{"class":1164},[1136,8041,8042],{"class":1138,"line":1732},[1136,8043,1874],{"class":1153},[1136,8045,8046,8049,8051,8053],{"class":1138,"line":1749},[1136,8047,8048],{"class":1153},"        command ",[1136,8050,1396],{"class":1164},[1136,8052,5727],{"class":1342},[1136,8054,2091],{"class":1164},[1136,8056,8057,8059,8061,8063],{"class":1138,"line":1764},[1136,8058,2098],{"class":2097},[1136,8060,1396],{"class":1164},[1136,8062,7635],{"class":3558},[1136,8064,1729],{"class":1164},[1136,8066,8067,8070,8073,8076,8078,8080,8082,8084,8086,8088,8090,8092],{"class":1138,"line":1779},[1136,8068,8069],{"class":2097},"            items",[1136,8071,8072],{"class":1164},"=[",[1136,8074,8075],{"class":1342},"OrderItemData",[1136,8077,1235],{"class":1164},[1136,8079,2218],{"class":2097},[1136,8081,1396],{"class":1164},[1136,8083,7635],{"class":3558},[1136,8085,1165],{"class":1164},[1136,8087,5200],{"class":2097},[1136,8089,1396],{"class":1164},[1136,8091,7666],{"class":3558},[1136,8093,8094],{"class":1164},")]\n",[1136,8096,8097],{"class":1138,"line":1794},[1136,8098,2145],{"class":1164},[1136,8100,8101],{"class":1138,"line":1799},[1136,8102,1874],{"class":1153},[1136,8104,8105],{"class":1138,"line":1835},[1136,8106,8107],{"class":1142},"        # Act\n",[1136,8109,8110,8112,8114,8117,8119,8122,8124,8126],{"class":1138,"line":1845},[1136,8111,6118],{"class":1153},[1136,8113,1396],{"class":1164},[1136,8115,8116],{"class":1153}," service",[1136,8118,1274],{"class":1164},[1136,8120,8121],{"class":1342},"place_order",[1136,8123,1235],{"class":1164},[1136,8125,5763],{"class":1342},[1136,8127,1439],{"class":1164},[1136,8129,8130],{"class":1138,"line":1851},[1136,8131,1874],{"class":1153},[1136,8133,8134],{"class":1138,"line":1871},[1136,8135,8136],{"class":1142},"        # Assert\n",[1136,8138,8139,8141,8144,8147,8149],{"class":1138,"line":1877},[1136,8140,7695],{"class":1149},[1136,8142,8143],{"class":1153}," order_id ",[1136,8145,8146],{"class":1412},"is",[1136,8148,1888],{"class":1412},[1136,8150,8151],{"class":2465}," None\n",[1136,8153,8154,8157,8159,8161,8163,8165,8167,8170],{"class":1138,"line":1883},[1136,8155,8156],{"class":1153},"        mock_repos",[1136,8158,1274],{"class":1164},[1136,8160,1756],{"class":1277},[1136,8162,1274],{"class":1164},[1136,8164,1940],{"class":1277},[1136,8166,1274],{"class":1164},[1136,8168,8169],{"class":1342},"assert_called_once",[1136,8171,1346],{"class":1164},[1136,8173,8174,8176,8178,8180,8182,8184,8186,8188],{"class":1138,"line":1895},[1136,8175,8156],{"class":1153},[1136,8177,1274],{"class":1164},[1136,8179,5674],{"class":1277},[1136,8181,1274],{"class":1164},[1136,8183,6086],{"class":1277},[1136,8185,1274],{"class":1164},[1136,8187,8169],{"class":1342},[1136,8189,1346],{"class":1164},[1030,8191,8193],{"id":8192},"next-steps","Next Steps",[1026,8195,8196],{},"Ready to master advanced Django development? Start with system architecture patterns to understand how to design scalable systems. Then dive into domain-driven design to create rich, maintainable business logic. Progress through large-scale project organization and plugin architectures to build extensible systems.",[1026,8198,8199],{},"Each chapter provides expert-level techniques, real-world examples, and production-proven patterns that transform intermediate Django developers into true experts capable of architecting and building enterprise-scale applications.",[1026,8201,8202],{},"The journey to Django mastery requires understanding not just the framework, but the principles of software architecture, domain modeling, and system design. This guide provides the knowledge and techniques needed to build Django applications that can scale to millions of users while remaining maintainable and extensible.",[1026,8204,8205],{},"Advanced Django development is about more than just knowing the framework—it's about understanding how to build systems that solve complex business problems while maintaining code quality, performance, and developer productivity at scale.",[8207,8208,8209],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1131,"searchDepth":1139,"depth":1146,"links":8211},[8212,8217,8221,8222,8226,8229,8230],{"id":1032,"depth":1146,"text":1033,"children":8213},[8214,8215,8216],{"id":1040,"depth":1171,"text":1041},{"id":1123,"depth":1171,"text":1124},{"id":2283,"depth":1171,"text":2284},{"id":3292,"depth":1146,"text":3293,"children":8218},[8219,8220],{"id":3296,"depth":1171,"text":3297},{"id":4317,"depth":1171,"text":4318},{"id":4986,"depth":1146,"text":4987},{"id":5048,"depth":1146,"text":5049,"children":8223},[8224,8225],{"id":5052,"depth":1171,"text":5053},{"id":6175,"depth":1171,"text":6176},{"id":6832,"depth":1146,"text":6833,"children":8227},[8228],{"id":6836,"depth":1171,"text":6837},{"id":7563,"depth":1146,"text":7564},{"id":8192,"depth":1146,"text":8193},"md",null,{},{"title":801,"description":1028},"jgNj-IVcBBqR3ile8LGWNwgTL4xHpikFKWWH5Fz7dP4",[8237,8239],{"title":797,"path":798,"stem":799,"description":8238,"children":-1},"Profiling is essential for identifying performance bottlenecks in Django applications. Without proper profiling, optimization efforts often target the wrong areas, wasting time and resources. This comprehensive guide covers profiling tools, techniques, and methodologies that help you understand where your application spends time and how to make it faster.",{"title":807,"path":808,"stem":809,"description":8240,"children":-1},"System architecture patterns provide proven solutions for organizing complex Django applications. These patterns help create maintainable, scalable, and testable systems by defining clear boundaries between components and establishing consistent communication patterns. This comprehensive guide covers the most important architectural patterns for Django applications.",1772474957237]