[{"data":1,"prerenderedAt":9052},["ShallowReactive",2],{"navigation":3,"/advanced-and-expert-topics/extending-djangos-core":1016,"/advanced-and-expert-topics/extending-djangos-core-surround":9047},[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":823,"body":1018,"description":1028,"extension":9042,"links":9043,"meta":9044,"navigation":1150,"path":824,"seo":9045,"stem":825,"__hash__":9046},"docs/22.advanced-and-expert-topics/06.extending-djangos-core.md",{"type":1019,"value":1020,"toc":9036},"minimark",[1021,1025,1029,1034,1037,3276,3280,3283,4557,4561,4564,6602,6606,6609,9029,9032],[1022,1023,823],"h1",{"id":1024},"extending-djangos-core",[1026,1027,1028],"p",{},"Django's architecture allows deep customization and extension of its core components. This comprehensive guide covers advanced techniques for extending Django's ORM, admin interface, authentication system, and other core components to create powerful, customized functionality that integrates seamlessly with the framework.",[1030,1031,1033],"h2",{"id":1032},"custom-model-fields","Custom Model Fields",[1026,1035,1036],{},"Custom model fields allow you to store and manipulate specialized data types that aren't supported by Django's built-in fields.",[1038,1039,1044],"pre",{"className":1040,"code":1041,"language":1042,"meta":1043,"style":1043},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Custom field for storing encrypted data\nimport json\nfrom cryptography.fernet import Fernet\nfrom django.db import models\nfrom django.core.exceptions import ValidationError\nfrom django.conf import settings\n\nclass EncryptedField(models.TextField):\n    \"\"\"Field that automatically encrypts/decrypts data\"\"\"\n    \n    def __init__(self, *args, **kwargs):\n        self.encryption_key = kwargs.pop('encryption_key', None)\n        super().__init__(*args, **kwargs)\n        \n        if not self.encryption_key:\n            self.encryption_key = getattr(settings, 'FIELD_ENCRYPTION_KEY', None)\n        \n        if not self.encryption_key:\n            raise ValueError(\"Encryption key is required\")\n        \n        self.cipher = Fernet(self.encryption_key.encode())\n    \n    def from_db_value(self, value, expression, connection):\n        \"\"\"Decrypt value when loading from database\"\"\"\n        if value is None:\n            return value\n        \n        try:\n            return self.cipher.decrypt(value.encode()).decode()\n        except Exception:\n            # Return original value if decryption fails\n            return value\n    \n    def to_python(self, value):\n        \"\"\"Convert value to Python type\"\"\"\n        if isinstance(value, str) or value is None:\n            return value\n        return str(value)\n    \n    def get_prep_value(self, value):\n        \"\"\"Encrypt value before saving to database\"\"\"\n        if value is None:\n            return value\n        \n        try:\n            return self.cipher.encrypt(str(value).encode()).decode()\n        except Exception as e:\n            raise ValidationError(f\"Encryption failed: {e}\")\n\n# Custom field for storing JSON with validation\nclass ValidatedJSONField(models.JSONField):\n    \"\"\"JSON field with schema validation\"\"\"\n    \n    def __init__(self, schema=None, *args, **kwargs):\n        self.schema = schema\n        super().__init__(*args, **kwargs)\n    \n    def validate(self, value, model_instance):\n        \"\"\"Validate JSON against schema\"\"\"\n        super().validate(value, model_instance)\n        \n        if self.schema and value is not None:\n            try:\n                import jsonschema\n                jsonschema.validate(value, self.schema)\n            except jsonschema.ValidationError as e:\n                raise ValidationError(f\"JSON validation failed: {e.message}\")\n            except ImportError:\n                # jsonschema not installed, skip validation\n                pass\n\n# Custom field for storing money amounts\nfrom decimal import Decimal\n\nclass MoneyField(models.DecimalField):\n    \"\"\"Field for storing monetary amounts with currency\"\"\"\n    \n    def __init__(self, currency_field=None, *args, **kwargs):\n        self.currency_field = currency_field or 'currency'\n        kwargs.setdefault('max_digits', 10)\n        kwargs.setdefault('decimal_places', 2)\n        super().__init__(*args, **kwargs)\n    \n    def contribute_to_class(self, cls, name, **kwargs):\n        \"\"\"Add currency field to model if it doesn't exist\"\"\"\n        super().contribute_to_class(cls, name, **kwargs)\n        \n        # Add currency field if it doesn't exist\n        if not hasattr(cls, self.currency_field):\n            currency_field = models.CharField(\n                max_length=3,\n                default='USD',\n                help_text='Currency code (ISO 4217)'\n            )\n            currency_field.contribute_to_class(cls, self.currency_field)\n    \n    def from_db_value(self, value, expression, connection):\n        \"\"\"Return Money object instead of Decimal\"\"\"\n        if value is None:\n            return None\n        return Money(amount=value, currency='USD')  # Currency loaded separately\n\nclass Money:\n    \"\"\"Money value object\"\"\"\n    \n    def __init__(self, amount, currency='USD'):\n        self.amount = Decimal(str(amount))\n        self.currency = currency\n    \n    def __str__(self):\n        return f\"{self.amount} {self.currency}\"\n    \n    def __add__(self, other):\n        if isinstance(other, Money):\n            if self.currency != other.currency:\n                raise ValueError(\"Cannot add different currencies\")\n            return Money(self.amount + other.amount, self.currency)\n        return Money(self.amount + Decimal(str(other)), self.currency)\n\n# Usage example\nclass Product(models.Model):\n    name = models.CharField(max_length=200)\n    price = MoneyField()  # Automatically adds 'currency' field\n    secret_data = EncryptedField()\n    metadata = ValidatedJSONField(schema={\n        'type': 'object',\n        'properties': {\n            'weight': {'type': 'number'},\n            'dimensions': {\n                'type': 'object',\n                'properties': {\n                    'length': {'type': 'number'},\n                    'width': {'type': 'number'},\n                    'height': {'type': 'number'}\n                }\n            }\n        }\n    })\n","python","",[1045,1046,1047,1056,1067,1088,1106,1128,1145,1152,1178,1192,1198,1235,1280,1308,1314,1333,1369,1374,1389,1410,1415,1446,1451,1481,1492,1507,1516,1521,1529,1563,1574,1580,1587,1592,1610,1620,1651,1658,1672,1677,1695,1705,1718,1725,1730,1737,1773,1788,1818,1823,1829,1848,1858,1863,1899,1914,1937,1942,1965,1975,1995,2000,2024,2032,2041,2065,2085,2115,2125,2131,2137,2142,2148,2161,2166,2185,2195,2200,2234,2260,2288,2313,2336,2341,2371,2381,2408,2413,2419,2443,2462,2477,2494,2509,2515,2539,2544,2569,2579,2592,2600,2635,2640,2649,2659,2664,2694,2719,2733,2738,2752,2786,2791,2810,2828,2851,2869,2903,2941,2946,2952,2971,2997,3013,3025,3042,3065,3080,3113,3127,3147,3160,3191,3221,3252,3258,3264,3270],"code",{"__ignoreMap":1043},[1048,1049,1052],"span",{"class":1050,"line":1051},"line",1,[1048,1053,1055],{"class":1054},"s9Tkl","# Custom field for storing encrypted data\n",[1048,1057,1059,1063],{"class":1050,"line":1058},2,[1048,1060,1062],{"class":1061},"siDh9","import",[1048,1064,1066],{"class":1065},"sftqT"," json\n",[1048,1068,1070,1073,1076,1080,1083,1085],{"class":1050,"line":1069},3,[1048,1071,1072],{"class":1061},"from",[1048,1074,1075],{"class":1065}," cryptography",[1048,1077,1079],{"class":1078},"soVBu",".",[1048,1081,1082],{"class":1065},"fernet ",[1048,1084,1062],{"class":1061},[1048,1086,1087],{"class":1065}," Fernet\n",[1048,1089,1091,1093,1096,1098,1101,1103],{"class":1050,"line":1090},4,[1048,1092,1072],{"class":1061},[1048,1094,1095],{"class":1065}," django",[1048,1097,1079],{"class":1078},[1048,1099,1100],{"class":1065},"db ",[1048,1102,1062],{"class":1061},[1048,1104,1105],{"class":1065}," models\n",[1048,1107,1109,1111,1113,1115,1118,1120,1123,1125],{"class":1050,"line":1108},5,[1048,1110,1072],{"class":1061},[1048,1112,1095],{"class":1065},[1048,1114,1079],{"class":1078},[1048,1116,1117],{"class":1065},"core",[1048,1119,1079],{"class":1078},[1048,1121,1122],{"class":1065},"exceptions ",[1048,1124,1062],{"class":1061},[1048,1126,1127],{"class":1065}," ValidationError\n",[1048,1129,1131,1133,1135,1137,1140,1142],{"class":1050,"line":1130},6,[1048,1132,1072],{"class":1061},[1048,1134,1095],{"class":1065},[1048,1136,1079],{"class":1078},[1048,1138,1139],{"class":1065},"conf ",[1048,1141,1062],{"class":1061},[1048,1143,1144],{"class":1065}," settings\n",[1048,1146,1148],{"class":1050,"line":1147},7,[1048,1149,1151],{"emptyLinePlaceholder":1150},true,"\n",[1048,1153,1155,1159,1163,1166,1170,1172,1175],{"class":1050,"line":1154},8,[1048,1156,1158],{"class":1157},"s5Kfy","class",[1048,1160,1162],{"class":1161},"sD-vU"," EncryptedField",[1048,1164,1165],{"class":1078},"(",[1048,1167,1169],{"class":1168},"sYn-s","models",[1048,1171,1079],{"class":1078},[1048,1173,1174],{"class":1168},"TextField",[1048,1176,1177],{"class":1078},"):\n",[1048,1179,1181,1185,1189],{"class":1050,"line":1180},9,[1048,1182,1184],{"class":1183},"sm7ve","    \"\"\"",[1048,1186,1188],{"class":1187},"sVyVU","Field that automatically encrypts/decrypts data",[1048,1190,1191],{"class":1183},"\"\"\"\n",[1048,1193,1195],{"class":1050,"line":1194},10,[1048,1196,1197],{"class":1065},"    \n",[1048,1199,1201,1204,1208,1210,1214,1217,1221,1225,1227,1230,1233],{"class":1050,"line":1200},11,[1048,1202,1203],{"class":1157},"    def",[1048,1205,1207],{"class":1206},"sJdAF"," __init__",[1048,1209,1165],{"class":1078},[1048,1211,1213],{"class":1212},"sRjD_","self",[1048,1215,1216],{"class":1078},",",[1048,1218,1220],{"class":1219},"sVsLi"," *",[1048,1222,1224],{"class":1223},"sCyAa","args",[1048,1226,1216],{"class":1078},[1048,1228,1229],{"class":1219}," **",[1048,1231,1232],{"class":1223},"kwargs",[1048,1234,1177],{"class":1078},[1048,1236,1238,1242,1244,1248,1251,1254,1256,1260,1262,1266,1269,1271,1273,1277],{"class":1050,"line":1237},12,[1048,1239,1241],{"class":1240},"se3Ec","        self",[1048,1243,1079],{"class":1078},[1048,1245,1247],{"class":1246},"sBPpx","encryption_key",[1048,1249,1250],{"class":1078}," =",[1048,1252,1253],{"class":1065}," kwargs",[1048,1255,1079],{"class":1078},[1048,1257,1259],{"class":1258},"siWMO","pop",[1048,1261,1165],{"class":1078},[1048,1263,1265],{"class":1264},"sbYkP","'",[1048,1267,1247],{"class":1268},"sTbE_",[1048,1270,1265],{"class":1264},[1048,1272,1216],{"class":1078},[1048,1274,1276],{"class":1275},"s8XtY"," None",[1048,1278,1279],{"class":1078},")\n",[1048,1281,1283,1287,1290,1293,1295,1298,1300,1302,1304,1306],{"class":1050,"line":1282},13,[1048,1284,1286],{"class":1285},"sa2tF","        super",[1048,1288,1289],{"class":1078},"().",[1048,1291,1292],{"class":1206},"__init__",[1048,1294,1165],{"class":1078},[1048,1296,1297],{"class":1219},"*",[1048,1299,1224],{"class":1258},[1048,1301,1216],{"class":1078},[1048,1303,1229],{"class":1219},[1048,1305,1232],{"class":1258},[1048,1307,1279],{"class":1078},[1048,1309,1311],{"class":1050,"line":1310},14,[1048,1312,1313],{"class":1065},"        \n",[1048,1315,1317,1320,1323,1326,1328,1330],{"class":1050,"line":1316},15,[1048,1318,1319],{"class":1061},"        if",[1048,1321,1322],{"class":1219}," not",[1048,1324,1325],{"class":1240}," self",[1048,1327,1079],{"class":1078},[1048,1329,1247],{"class":1246},[1048,1331,1332],{"class":1078},":\n",[1048,1334,1336,1339,1341,1343,1345,1348,1350,1353,1355,1358,1361,1363,1365,1367],{"class":1050,"line":1335},16,[1048,1337,1338],{"class":1240},"            self",[1048,1340,1079],{"class":1078},[1048,1342,1247],{"class":1246},[1048,1344,1250],{"class":1078},[1048,1346,1347],{"class":1206}," getattr",[1048,1349,1165],{"class":1078},[1048,1351,1352],{"class":1258},"settings",[1048,1354,1216],{"class":1078},[1048,1356,1357],{"class":1264}," '",[1048,1359,1360],{"class":1268},"FIELD_ENCRYPTION_KEY",[1048,1362,1265],{"class":1264},[1048,1364,1216],{"class":1078},[1048,1366,1276],{"class":1275},[1048,1368,1279],{"class":1078},[1048,1370,1372],{"class":1050,"line":1371},17,[1048,1373,1313],{"class":1065},[1048,1375,1377,1379,1381,1383,1385,1387],{"class":1050,"line":1376},18,[1048,1378,1319],{"class":1061},[1048,1380,1322],{"class":1219},[1048,1382,1325],{"class":1240},[1048,1384,1079],{"class":1078},[1048,1386,1247],{"class":1246},[1048,1388,1332],{"class":1078},[1048,1390,1392,1395,1398,1400,1403,1406,1408],{"class":1050,"line":1391},19,[1048,1393,1394],{"class":1061},"            raise",[1048,1396,1397],{"class":1285}," ValueError",[1048,1399,1165],{"class":1078},[1048,1401,1402],{"class":1264},"\"",[1048,1404,1405],{"class":1268},"Encryption key is required",[1048,1407,1402],{"class":1264},[1048,1409,1279],{"class":1078},[1048,1411,1413],{"class":1050,"line":1412},20,[1048,1414,1313],{"class":1065},[1048,1416,1418,1420,1422,1425,1427,1430,1432,1434,1436,1438,1440,1443],{"class":1050,"line":1417},21,[1048,1419,1241],{"class":1240},[1048,1421,1079],{"class":1078},[1048,1423,1424],{"class":1246},"cipher",[1048,1426,1250],{"class":1078},[1048,1428,1429],{"class":1258}," Fernet",[1048,1431,1165],{"class":1078},[1048,1433,1213],{"class":1240},[1048,1435,1079],{"class":1078},[1048,1437,1247],{"class":1246},[1048,1439,1079],{"class":1078},[1048,1441,1442],{"class":1258},"encode",[1048,1444,1445],{"class":1078},"())\n",[1048,1447,1449],{"class":1050,"line":1448},22,[1048,1450,1197],{"class":1065},[1048,1452,1454,1456,1460,1462,1464,1466,1469,1471,1474,1476,1479],{"class":1050,"line":1453},23,[1048,1455,1203],{"class":1157},[1048,1457,1459],{"class":1458},"sljsM"," from_db_value",[1048,1461,1165],{"class":1078},[1048,1463,1213],{"class":1212},[1048,1465,1216],{"class":1078},[1048,1467,1468],{"class":1223}," value",[1048,1470,1216],{"class":1078},[1048,1472,1473],{"class":1223}," expression",[1048,1475,1216],{"class":1078},[1048,1477,1478],{"class":1223}," connection",[1048,1480,1177],{"class":1078},[1048,1482,1484,1487,1490],{"class":1050,"line":1483},24,[1048,1485,1486],{"class":1183},"        \"\"\"",[1048,1488,1489],{"class":1187},"Decrypt value when loading from database",[1048,1491,1191],{"class":1183},[1048,1493,1495,1497,1500,1503,1505],{"class":1050,"line":1494},25,[1048,1496,1319],{"class":1061},[1048,1498,1499],{"class":1065}," value ",[1048,1501,1502],{"class":1219},"is",[1048,1504,1276],{"class":1275},[1048,1506,1332],{"class":1078},[1048,1508,1510,1513],{"class":1050,"line":1509},26,[1048,1511,1512],{"class":1061},"            return",[1048,1514,1515],{"class":1065}," value\n",[1048,1517,1519],{"class":1050,"line":1518},27,[1048,1520,1313],{"class":1065},[1048,1522,1524,1527],{"class":1050,"line":1523},28,[1048,1525,1526],{"class":1061},"        try",[1048,1528,1332],{"class":1078},[1048,1530,1532,1534,1536,1538,1540,1542,1545,1547,1550,1552,1554,1557,1560],{"class":1050,"line":1531},29,[1048,1533,1512],{"class":1061},[1048,1535,1325],{"class":1240},[1048,1537,1079],{"class":1078},[1048,1539,1424],{"class":1246},[1048,1541,1079],{"class":1078},[1048,1543,1544],{"class":1258},"decrypt",[1048,1546,1165],{"class":1078},[1048,1548,1549],{"class":1258},"value",[1048,1551,1079],{"class":1078},[1048,1553,1442],{"class":1258},[1048,1555,1556],{"class":1078},"()).",[1048,1558,1559],{"class":1258},"decode",[1048,1561,1562],{"class":1078},"()\n",[1048,1564,1566,1569,1572],{"class":1050,"line":1565},30,[1048,1567,1568],{"class":1061},"        except",[1048,1570,1571],{"class":1285}," Exception",[1048,1573,1332],{"class":1078},[1048,1575,1577],{"class":1050,"line":1576},31,[1048,1578,1579],{"class":1054},"            # Return original value if decryption fails\n",[1048,1581,1583,1585],{"class":1050,"line":1582},32,[1048,1584,1512],{"class":1061},[1048,1586,1515],{"class":1065},[1048,1588,1590],{"class":1050,"line":1589},33,[1048,1591,1197],{"class":1065},[1048,1593,1595,1597,1600,1602,1604,1606,1608],{"class":1050,"line":1594},34,[1048,1596,1203],{"class":1157},[1048,1598,1599],{"class":1458}," to_python",[1048,1601,1165],{"class":1078},[1048,1603,1213],{"class":1212},[1048,1605,1216],{"class":1078},[1048,1607,1468],{"class":1223},[1048,1609,1177],{"class":1078},[1048,1611,1613,1615,1618],{"class":1050,"line":1612},35,[1048,1614,1486],{"class":1183},[1048,1616,1617],{"class":1187},"Convert value to Python type",[1048,1619,1191],{"class":1183},[1048,1621,1623,1625,1628,1630,1632,1634,1637,1640,1643,1645,1647,1649],{"class":1050,"line":1622},36,[1048,1624,1319],{"class":1061},[1048,1626,1627],{"class":1206}," isinstance",[1048,1629,1165],{"class":1078},[1048,1631,1549],{"class":1258},[1048,1633,1216],{"class":1078},[1048,1635,1636],{"class":1285}," str",[1048,1638,1639],{"class":1078},")",[1048,1641,1642],{"class":1219}," or",[1048,1644,1499],{"class":1065},[1048,1646,1502],{"class":1219},[1048,1648,1276],{"class":1275},[1048,1650,1332],{"class":1078},[1048,1652,1654,1656],{"class":1050,"line":1653},37,[1048,1655,1512],{"class":1061},[1048,1657,1515],{"class":1065},[1048,1659,1661,1664,1666,1668,1670],{"class":1050,"line":1660},38,[1048,1662,1663],{"class":1061},"        return",[1048,1665,1636],{"class":1285},[1048,1667,1165],{"class":1078},[1048,1669,1549],{"class":1258},[1048,1671,1279],{"class":1078},[1048,1673,1675],{"class":1050,"line":1674},39,[1048,1676,1197],{"class":1065},[1048,1678,1680,1682,1685,1687,1689,1691,1693],{"class":1050,"line":1679},40,[1048,1681,1203],{"class":1157},[1048,1683,1684],{"class":1458}," get_prep_value",[1048,1686,1165],{"class":1078},[1048,1688,1213],{"class":1212},[1048,1690,1216],{"class":1078},[1048,1692,1468],{"class":1223},[1048,1694,1177],{"class":1078},[1048,1696,1698,1700,1703],{"class":1050,"line":1697},41,[1048,1699,1486],{"class":1183},[1048,1701,1702],{"class":1187},"Encrypt value before saving to database",[1048,1704,1191],{"class":1183},[1048,1706,1708,1710,1712,1714,1716],{"class":1050,"line":1707},42,[1048,1709,1319],{"class":1061},[1048,1711,1499],{"class":1065},[1048,1713,1502],{"class":1219},[1048,1715,1276],{"class":1275},[1048,1717,1332],{"class":1078},[1048,1719,1721,1723],{"class":1050,"line":1720},43,[1048,1722,1512],{"class":1061},[1048,1724,1515],{"class":1065},[1048,1726,1728],{"class":1050,"line":1727},44,[1048,1729,1313],{"class":1065},[1048,1731,1733,1735],{"class":1050,"line":1732},45,[1048,1734,1526],{"class":1061},[1048,1736,1332],{"class":1078},[1048,1738,1740,1742,1744,1746,1748,1750,1753,1755,1758,1760,1762,1765,1767,1769,1771],{"class":1050,"line":1739},46,[1048,1741,1512],{"class":1061},[1048,1743,1325],{"class":1240},[1048,1745,1079],{"class":1078},[1048,1747,1424],{"class":1246},[1048,1749,1079],{"class":1078},[1048,1751,1752],{"class":1258},"encrypt",[1048,1754,1165],{"class":1078},[1048,1756,1757],{"class":1285},"str",[1048,1759,1165],{"class":1078},[1048,1761,1549],{"class":1258},[1048,1763,1764],{"class":1078},").",[1048,1766,1442],{"class":1258},[1048,1768,1556],{"class":1078},[1048,1770,1559],{"class":1258},[1048,1772,1562],{"class":1078},[1048,1774,1776,1778,1780,1783,1786],{"class":1050,"line":1775},47,[1048,1777,1568],{"class":1061},[1048,1779,1571],{"class":1285},[1048,1781,1782],{"class":1061}," as",[1048,1784,1785],{"class":1065}," e",[1048,1787,1332],{"class":1078},[1048,1789,1791,1793,1796,1798,1801,1804,1808,1811,1814,1816],{"class":1050,"line":1790},48,[1048,1792,1394],{"class":1061},[1048,1794,1795],{"class":1258}," ValidationError",[1048,1797,1165],{"class":1078},[1048,1799,1800],{"class":1157},"f",[1048,1802,1803],{"class":1268},"\"Encryption failed: ",[1048,1805,1807],{"class":1806},"s3h35","{",[1048,1809,1810],{"class":1258},"e",[1048,1812,1813],{"class":1806},"}",[1048,1815,1402],{"class":1268},[1048,1817,1279],{"class":1078},[1048,1819,1821],{"class":1050,"line":1820},49,[1048,1822,1151],{"emptyLinePlaceholder":1150},[1048,1824,1826],{"class":1050,"line":1825},50,[1048,1827,1828],{"class":1054},"# Custom field for storing JSON with validation\n",[1048,1830,1832,1834,1837,1839,1841,1843,1846],{"class":1050,"line":1831},51,[1048,1833,1158],{"class":1157},[1048,1835,1836],{"class":1161}," ValidatedJSONField",[1048,1838,1165],{"class":1078},[1048,1840,1169],{"class":1168},[1048,1842,1079],{"class":1078},[1048,1844,1845],{"class":1168},"JSONField",[1048,1847,1177],{"class":1078},[1048,1849,1851,1853,1856],{"class":1050,"line":1850},52,[1048,1852,1184],{"class":1183},[1048,1854,1855],{"class":1187},"JSON field with schema validation",[1048,1857,1191],{"class":1183},[1048,1859,1861],{"class":1050,"line":1860},53,[1048,1862,1197],{"class":1065},[1048,1864,1866,1868,1870,1872,1874,1876,1879,1882,1885,1887,1889,1891,1893,1895,1897],{"class":1050,"line":1865},54,[1048,1867,1203],{"class":1157},[1048,1869,1207],{"class":1206},[1048,1871,1165],{"class":1078},[1048,1873,1213],{"class":1212},[1048,1875,1216],{"class":1078},[1048,1877,1878],{"class":1223}," schema",[1048,1880,1881],{"class":1219},"=",[1048,1883,1884],{"class":1275},"None",[1048,1886,1216],{"class":1078},[1048,1888,1220],{"class":1219},[1048,1890,1224],{"class":1223},[1048,1892,1216],{"class":1078},[1048,1894,1229],{"class":1219},[1048,1896,1232],{"class":1223},[1048,1898,1177],{"class":1078},[1048,1900,1902,1904,1906,1909,1911],{"class":1050,"line":1901},55,[1048,1903,1241],{"class":1240},[1048,1905,1079],{"class":1078},[1048,1907,1908],{"class":1246},"schema",[1048,1910,1250],{"class":1078},[1048,1912,1913],{"class":1065}," schema\n",[1048,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935],{"class":1050,"line":1916},56,[1048,1918,1286],{"class":1285},[1048,1920,1289],{"class":1078},[1048,1922,1292],{"class":1206},[1048,1924,1165],{"class":1078},[1048,1926,1297],{"class":1219},[1048,1928,1224],{"class":1258},[1048,1930,1216],{"class":1078},[1048,1932,1229],{"class":1219},[1048,1934,1232],{"class":1258},[1048,1936,1279],{"class":1078},[1048,1938,1940],{"class":1050,"line":1939},57,[1048,1941,1197],{"class":1065},[1048,1943,1945,1947,1950,1952,1954,1956,1958,1960,1963],{"class":1050,"line":1944},58,[1048,1946,1203],{"class":1157},[1048,1948,1949],{"class":1458}," validate",[1048,1951,1165],{"class":1078},[1048,1953,1213],{"class":1212},[1048,1955,1216],{"class":1078},[1048,1957,1468],{"class":1223},[1048,1959,1216],{"class":1078},[1048,1961,1962],{"class":1223}," model_instance",[1048,1964,1177],{"class":1078},[1048,1966,1968,1970,1973],{"class":1050,"line":1967},59,[1048,1969,1486],{"class":1183},[1048,1971,1972],{"class":1187},"Validate JSON against schema",[1048,1974,1191],{"class":1183},[1048,1976,1978,1980,1982,1985,1987,1989,1991,1993],{"class":1050,"line":1977},60,[1048,1979,1286],{"class":1285},[1048,1981,1289],{"class":1078},[1048,1983,1984],{"class":1258},"validate",[1048,1986,1165],{"class":1078},[1048,1988,1549],{"class":1258},[1048,1990,1216],{"class":1078},[1048,1992,1962],{"class":1258},[1048,1994,1279],{"class":1078},[1048,1996,1998],{"class":1050,"line":1997},61,[1048,1999,1313],{"class":1065},[1048,2001,2003,2005,2007,2009,2011,2014,2016,2018,2020,2022],{"class":1050,"line":2002},62,[1048,2004,1319],{"class":1061},[1048,2006,1325],{"class":1240},[1048,2008,1079],{"class":1078},[1048,2010,1908],{"class":1246},[1048,2012,2013],{"class":1219}," and",[1048,2015,1499],{"class":1065},[1048,2017,1502],{"class":1219},[1048,2019,1322],{"class":1219},[1048,2021,1276],{"class":1275},[1048,2023,1332],{"class":1078},[1048,2025,2027,2030],{"class":1050,"line":2026},63,[1048,2028,2029],{"class":1061},"            try",[1048,2031,1332],{"class":1078},[1048,2033,2035,2038],{"class":1050,"line":2034},64,[1048,2036,2037],{"class":1061},"                import",[1048,2039,2040],{"class":1065}," jsonschema\n",[1048,2042,2044,2047,2049,2051,2053,2055,2057,2059,2061,2063],{"class":1050,"line":2043},65,[1048,2045,2046],{"class":1065},"                jsonschema",[1048,2048,1079],{"class":1078},[1048,2050,1984],{"class":1258},[1048,2052,1165],{"class":1078},[1048,2054,1549],{"class":1258},[1048,2056,1216],{"class":1078},[1048,2058,1325],{"class":1240},[1048,2060,1079],{"class":1078},[1048,2062,1908],{"class":1246},[1048,2064,1279],{"class":1078},[1048,2066,2068,2071,2074,2076,2079,2081,2083],{"class":1050,"line":2067},66,[1048,2069,2070],{"class":1061},"            except",[1048,2072,2073],{"class":1065}," jsonschema",[1048,2075,1079],{"class":1078},[1048,2077,2078],{"class":1246},"ValidationError",[1048,2080,1782],{"class":1061},[1048,2082,1785],{"class":1065},[1048,2084,1332],{"class":1078},[1048,2086,2088,2091,2093,2095,2097,2100,2102,2104,2106,2109,2111,2113],{"class":1050,"line":2087},67,[1048,2089,2090],{"class":1061},"                raise",[1048,2092,1795],{"class":1258},[1048,2094,1165],{"class":1078},[1048,2096,1800],{"class":1157},[1048,2098,2099],{"class":1268},"\"JSON validation failed: ",[1048,2101,1807],{"class":1806},[1048,2103,1810],{"class":1258},[1048,2105,1079],{"class":1078},[1048,2107,2108],{"class":1246},"message",[1048,2110,1813],{"class":1806},[1048,2112,1402],{"class":1268},[1048,2114,1279],{"class":1078},[1048,2116,2118,2120,2123],{"class":1050,"line":2117},68,[1048,2119,2070],{"class":1061},[1048,2121,2122],{"class":1285}," ImportError",[1048,2124,1332],{"class":1078},[1048,2126,2128],{"class":1050,"line":2127},69,[1048,2129,2130],{"class":1054},"                # jsonschema not installed, skip validation\n",[1048,2132,2134],{"class":1050,"line":2133},70,[1048,2135,2136],{"class":1061},"                pass\n",[1048,2138,2140],{"class":1050,"line":2139},71,[1048,2141,1151],{"emptyLinePlaceholder":1150},[1048,2143,2145],{"class":1050,"line":2144},72,[1048,2146,2147],{"class":1054},"# Custom field for storing money amounts\n",[1048,2149,2151,2153,2156,2158],{"class":1050,"line":2150},73,[1048,2152,1072],{"class":1061},[1048,2154,2155],{"class":1065}," decimal ",[1048,2157,1062],{"class":1061},[1048,2159,2160],{"class":1065}," Decimal\n",[1048,2162,2164],{"class":1050,"line":2163},74,[1048,2165,1151],{"emptyLinePlaceholder":1150},[1048,2167,2169,2171,2174,2176,2178,2180,2183],{"class":1050,"line":2168},75,[1048,2170,1158],{"class":1157},[1048,2172,2173],{"class":1161}," MoneyField",[1048,2175,1165],{"class":1078},[1048,2177,1169],{"class":1168},[1048,2179,1079],{"class":1078},[1048,2181,2182],{"class":1168},"DecimalField",[1048,2184,1177],{"class":1078},[1048,2186,2188,2190,2193],{"class":1050,"line":2187},76,[1048,2189,1184],{"class":1183},[1048,2191,2192],{"class":1187},"Field for storing monetary amounts with currency",[1048,2194,1191],{"class":1183},[1048,2196,2198],{"class":1050,"line":2197},77,[1048,2199,1197],{"class":1065},[1048,2201,2203,2205,2207,2209,2211,2213,2216,2218,2220,2222,2224,2226,2228,2230,2232],{"class":1050,"line":2202},78,[1048,2204,1203],{"class":1157},[1048,2206,1207],{"class":1206},[1048,2208,1165],{"class":1078},[1048,2210,1213],{"class":1212},[1048,2212,1216],{"class":1078},[1048,2214,2215],{"class":1223}," currency_field",[1048,2217,1881],{"class":1219},[1048,2219,1884],{"class":1275},[1048,2221,1216],{"class":1078},[1048,2223,1220],{"class":1219},[1048,2225,1224],{"class":1223},[1048,2227,1216],{"class":1078},[1048,2229,1229],{"class":1219},[1048,2231,1232],{"class":1223},[1048,2233,1177],{"class":1078},[1048,2235,2237,2239,2241,2244,2246,2249,2252,2254,2257],{"class":1050,"line":2236},79,[1048,2238,1241],{"class":1240},[1048,2240,1079],{"class":1078},[1048,2242,2243],{"class":1246},"currency_field",[1048,2245,1250],{"class":1078},[1048,2247,2248],{"class":1065}," currency_field ",[1048,2250,2251],{"class":1219},"or",[1048,2253,1357],{"class":1264},[1048,2255,2256],{"class":1268},"currency",[1048,2258,2259],{"class":1264},"'\n",[1048,2261,2263,2266,2268,2271,2273,2275,2278,2280,2282,2286],{"class":1050,"line":2262},80,[1048,2264,2265],{"class":1065},"        kwargs",[1048,2267,1079],{"class":1078},[1048,2269,2270],{"class":1258},"setdefault",[1048,2272,1165],{"class":1078},[1048,2274,1265],{"class":1264},[1048,2276,2277],{"class":1268},"max_digits",[1048,2279,1265],{"class":1264},[1048,2281,1216],{"class":1078},[1048,2283,2285],{"class":2284},"s7CZa"," 10",[1048,2287,1279],{"class":1078},[1048,2289,2291,2293,2295,2297,2299,2301,2304,2306,2308,2311],{"class":1050,"line":2290},81,[1048,2292,2265],{"class":1065},[1048,2294,1079],{"class":1078},[1048,2296,2270],{"class":1258},[1048,2298,1165],{"class":1078},[1048,2300,1265],{"class":1264},[1048,2302,2303],{"class":1268},"decimal_places",[1048,2305,1265],{"class":1264},[1048,2307,1216],{"class":1078},[1048,2309,2310],{"class":2284}," 2",[1048,2312,1279],{"class":1078},[1048,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334],{"class":1050,"line":2315},82,[1048,2317,1286],{"class":1285},[1048,2319,1289],{"class":1078},[1048,2321,1292],{"class":1206},[1048,2323,1165],{"class":1078},[1048,2325,1297],{"class":1219},[1048,2327,1224],{"class":1258},[1048,2329,1216],{"class":1078},[1048,2331,1229],{"class":1219},[1048,2333,1232],{"class":1258},[1048,2335,1279],{"class":1078},[1048,2337,2339],{"class":1050,"line":2338},83,[1048,2340,1197],{"class":1065},[1048,2342,2344,2346,2349,2351,2353,2355,2358,2360,2363,2365,2367,2369],{"class":1050,"line":2343},84,[1048,2345,1203],{"class":1157},[1048,2347,2348],{"class":1458}," contribute_to_class",[1048,2350,1165],{"class":1078},[1048,2352,1213],{"class":1212},[1048,2354,1216],{"class":1078},[1048,2356,2357],{"class":1223}," cls",[1048,2359,1216],{"class":1078},[1048,2361,2362],{"class":1223}," name",[1048,2364,1216],{"class":1078},[1048,2366,1229],{"class":1219},[1048,2368,1232],{"class":1223},[1048,2370,1177],{"class":1078},[1048,2372,2374,2376,2379],{"class":1050,"line":2373},85,[1048,2375,1486],{"class":1183},[1048,2377,2378],{"class":1187},"Add currency field to model if it doesn't exist",[1048,2380,1191],{"class":1183},[1048,2382,2384,2386,2388,2391,2393,2396,2398,2400,2402,2404,2406],{"class":1050,"line":2383},86,[1048,2385,1286],{"class":1285},[1048,2387,1289],{"class":1078},[1048,2389,2390],{"class":1258},"contribute_to_class",[1048,2392,1165],{"class":1078},[1048,2394,2395],{"class":1240},"cls",[1048,2397,1216],{"class":1078},[1048,2399,2362],{"class":1258},[1048,2401,1216],{"class":1078},[1048,2403,1229],{"class":1219},[1048,2405,1232],{"class":1258},[1048,2407,1279],{"class":1078},[1048,2409,2411],{"class":1050,"line":2410},87,[1048,2412,1313],{"class":1065},[1048,2414,2416],{"class":1050,"line":2415},88,[1048,2417,2418],{"class":1054},"        # Add currency field if it doesn't exist\n",[1048,2420,2422,2424,2426,2429,2431,2433,2435,2437,2439,2441],{"class":1050,"line":2421},89,[1048,2423,1319],{"class":1061},[1048,2425,1322],{"class":1219},[1048,2427,2428],{"class":1206}," hasattr",[1048,2430,1165],{"class":1078},[1048,2432,2395],{"class":1240},[1048,2434,1216],{"class":1078},[1048,2436,1325],{"class":1240},[1048,2438,1079],{"class":1078},[1048,2440,2243],{"class":1246},[1048,2442,1177],{"class":1078},[1048,2444,2446,2449,2451,2454,2456,2459],{"class":1050,"line":2445},90,[1048,2447,2448],{"class":1065},"            currency_field ",[1048,2450,1881],{"class":1078},[1048,2452,2453],{"class":1065}," models",[1048,2455,1079],{"class":1078},[1048,2457,2458],{"class":1258},"CharField",[1048,2460,2461],{"class":1078},"(\n",[1048,2463,2465,2469,2471,2474],{"class":1050,"line":2464},91,[1048,2466,2468],{"class":2467},"sqOPj","                max_length",[1048,2470,1881],{"class":1078},[1048,2472,2473],{"class":2284},"3",[1048,2475,2476],{"class":1078},",\n",[1048,2478,2480,2483,2485,2487,2490,2492],{"class":1050,"line":2479},92,[1048,2481,2482],{"class":2467},"                default",[1048,2484,1881],{"class":1078},[1048,2486,1265],{"class":1264},[1048,2488,2489],{"class":1268},"USD",[1048,2491,1265],{"class":1264},[1048,2493,2476],{"class":1078},[1048,2495,2497,2500,2502,2504,2507],{"class":1050,"line":2496},93,[1048,2498,2499],{"class":2467},"                help_text",[1048,2501,1881],{"class":1078},[1048,2503,1265],{"class":1264},[1048,2505,2506],{"class":1268},"Currency code (ISO 4217)",[1048,2508,2259],{"class":1264},[1048,2510,2512],{"class":1050,"line":2511},94,[1048,2513,2514],{"class":1078},"            )\n",[1048,2516,2518,2521,2523,2525,2527,2529,2531,2533,2535,2537],{"class":1050,"line":2517},95,[1048,2519,2520],{"class":1065},"            currency_field",[1048,2522,1079],{"class":1078},[1048,2524,2390],{"class":1258},[1048,2526,1165],{"class":1078},[1048,2528,2395],{"class":1240},[1048,2530,1216],{"class":1078},[1048,2532,1325],{"class":1240},[1048,2534,1079],{"class":1078},[1048,2536,2243],{"class":1246},[1048,2538,1279],{"class":1078},[1048,2540,2542],{"class":1050,"line":2541},96,[1048,2543,1197],{"class":1065},[1048,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567],{"class":1050,"line":2546},97,[1048,2548,1203],{"class":1157},[1048,2550,1459],{"class":1458},[1048,2552,1165],{"class":1078},[1048,2554,1213],{"class":1212},[1048,2556,1216],{"class":1078},[1048,2558,1468],{"class":1223},[1048,2560,1216],{"class":1078},[1048,2562,1473],{"class":1223},[1048,2564,1216],{"class":1078},[1048,2566,1478],{"class":1223},[1048,2568,1177],{"class":1078},[1048,2570,2572,2574,2577],{"class":1050,"line":2571},98,[1048,2573,1486],{"class":1183},[1048,2575,2576],{"class":1187},"Return Money object instead of Decimal",[1048,2578,1191],{"class":1183},[1048,2580,2582,2584,2586,2588,2590],{"class":1050,"line":2581},99,[1048,2583,1319],{"class":1061},[1048,2585,1499],{"class":1065},[1048,2587,1502],{"class":1219},[1048,2589,1276],{"class":1275},[1048,2591,1332],{"class":1078},[1048,2593,2595,2597],{"class":1050,"line":2594},100,[1048,2596,1512],{"class":1061},[1048,2598,2599],{"class":1275}," None\n",[1048,2601,2603,2605,2608,2610,2613,2615,2617,2619,2622,2624,2626,2628,2630,2632],{"class":1050,"line":2602},101,[1048,2604,1663],{"class":1061},[1048,2606,2607],{"class":1258}," Money",[1048,2609,1165],{"class":1078},[1048,2611,2612],{"class":2467},"amount",[1048,2614,1881],{"class":1078},[1048,2616,1549],{"class":1258},[1048,2618,1216],{"class":1078},[1048,2620,2621],{"class":2467}," currency",[1048,2623,1881],{"class":1078},[1048,2625,1265],{"class":1264},[1048,2627,2489],{"class":1268},[1048,2629,1265],{"class":1264},[1048,2631,1639],{"class":1078},[1048,2633,2634],{"class":1054},"  # Currency loaded separately\n",[1048,2636,2638],{"class":1050,"line":2637},102,[1048,2639,1151],{"emptyLinePlaceholder":1150},[1048,2641,2643,2645,2647],{"class":1050,"line":2642},103,[1048,2644,1158],{"class":1157},[1048,2646,2607],{"class":1161},[1048,2648,1332],{"class":1078},[1048,2650,2652,2654,2657],{"class":1050,"line":2651},104,[1048,2653,1184],{"class":1183},[1048,2655,2656],{"class":1187},"Money value object",[1048,2658,1191],{"class":1183},[1048,2660,2662],{"class":1050,"line":2661},105,[1048,2663,1197],{"class":1065},[1048,2665,2667,2669,2671,2673,2675,2677,2680,2682,2684,2686,2688,2690,2692],{"class":1050,"line":2666},106,[1048,2668,1203],{"class":1157},[1048,2670,1207],{"class":1206},[1048,2672,1165],{"class":1078},[1048,2674,1213],{"class":1212},[1048,2676,1216],{"class":1078},[1048,2678,2679],{"class":1223}," amount",[1048,2681,1216],{"class":1078},[1048,2683,2621],{"class":1223},[1048,2685,1881],{"class":1219},[1048,2687,1265],{"class":1264},[1048,2689,2489],{"class":1268},[1048,2691,1265],{"class":1264},[1048,2693,1177],{"class":1078},[1048,2695,2697,2699,2701,2703,2705,2708,2710,2712,2714,2716],{"class":1050,"line":2696},107,[1048,2698,1241],{"class":1240},[1048,2700,1079],{"class":1078},[1048,2702,2612],{"class":1246},[1048,2704,1250],{"class":1078},[1048,2706,2707],{"class":1258}," Decimal",[1048,2709,1165],{"class":1078},[1048,2711,1757],{"class":1285},[1048,2713,1165],{"class":1078},[1048,2715,2612],{"class":1258},[1048,2717,2718],{"class":1078},"))\n",[1048,2720,2722,2724,2726,2728,2730],{"class":1050,"line":2721},108,[1048,2723,1241],{"class":1240},[1048,2725,1079],{"class":1078},[1048,2727,2256],{"class":1246},[1048,2729,1250],{"class":1078},[1048,2731,2732],{"class":1065}," currency\n",[1048,2734,2736],{"class":1050,"line":2735},109,[1048,2737,1197],{"class":1065},[1048,2739,2741,2743,2746,2748,2750],{"class":1050,"line":2740},110,[1048,2742,1203],{"class":1157},[1048,2744,2745],{"class":1206}," __str__",[1048,2747,1165],{"class":1078},[1048,2749,1213],{"class":1212},[1048,2751,1177],{"class":1078},[1048,2753,2755,2757,2760,2762,2764,2766,2768,2770,2772,2775,2777,2779,2781,2783],{"class":1050,"line":2754},111,[1048,2756,1663],{"class":1061},[1048,2758,2759],{"class":1157}," f",[1048,2761,1402],{"class":1268},[1048,2763,1807],{"class":1806},[1048,2765,1213],{"class":1240},[1048,2767,1079],{"class":1078},[1048,2769,2612],{"class":1246},[1048,2771,1813],{"class":1806},[1048,2773,2774],{"class":1806}," {",[1048,2776,1213],{"class":1240},[1048,2778,1079],{"class":1078},[1048,2780,2256],{"class":1246},[1048,2782,1813],{"class":1806},[1048,2784,2785],{"class":1268},"\"\n",[1048,2787,2789],{"class":1050,"line":2788},112,[1048,2790,1197],{"class":1065},[1048,2792,2794,2796,2799,2801,2803,2805,2808],{"class":1050,"line":2793},113,[1048,2795,1203],{"class":1157},[1048,2797,2798],{"class":1206}," __add__",[1048,2800,1165],{"class":1078},[1048,2802,1213],{"class":1212},[1048,2804,1216],{"class":1078},[1048,2806,2807],{"class":1223}," other",[1048,2809,1177],{"class":1078},[1048,2811,2813,2815,2817,2819,2822,2824,2826],{"class":1050,"line":2812},114,[1048,2814,1319],{"class":1061},[1048,2816,1627],{"class":1206},[1048,2818,1165],{"class":1078},[1048,2820,2821],{"class":1258},"other",[1048,2823,1216],{"class":1078},[1048,2825,2607],{"class":1258},[1048,2827,1177],{"class":1078},[1048,2829,2831,2834,2836,2838,2840,2843,2845,2847,2849],{"class":1050,"line":2830},115,[1048,2832,2833],{"class":1061},"            if",[1048,2835,1325],{"class":1240},[1048,2837,1079],{"class":1078},[1048,2839,2256],{"class":1246},[1048,2841,2842],{"class":1219}," !=",[1048,2844,2807],{"class":1065},[1048,2846,1079],{"class":1078},[1048,2848,2256],{"class":1246},[1048,2850,1332],{"class":1078},[1048,2852,2854,2856,2858,2860,2862,2865,2867],{"class":1050,"line":2853},116,[1048,2855,2090],{"class":1061},[1048,2857,1397],{"class":1285},[1048,2859,1165],{"class":1078},[1048,2861,1402],{"class":1264},[1048,2863,2864],{"class":1268},"Cannot add different currencies",[1048,2866,1402],{"class":1264},[1048,2868,1279],{"class":1078},[1048,2870,2872,2874,2876,2878,2880,2882,2884,2887,2889,2891,2893,2895,2897,2899,2901],{"class":1050,"line":2871},117,[1048,2873,1512],{"class":1061},[1048,2875,2607],{"class":1258},[1048,2877,1165],{"class":1078},[1048,2879,1213],{"class":1240},[1048,2881,1079],{"class":1078},[1048,2883,2612],{"class":1246},[1048,2885,2886],{"class":1219}," +",[1048,2888,2807],{"class":1258},[1048,2890,1079],{"class":1078},[1048,2892,2612],{"class":1246},[1048,2894,1216],{"class":1078},[1048,2896,1325],{"class":1240},[1048,2898,1079],{"class":1078},[1048,2900,2256],{"class":1246},[1048,2902,1279],{"class":1078},[1048,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930,2933,2935,2937,2939],{"class":1050,"line":2905},118,[1048,2907,1663],{"class":1061},[1048,2909,2607],{"class":1258},[1048,2911,1165],{"class":1078},[1048,2913,1213],{"class":1240},[1048,2915,1079],{"class":1078},[1048,2917,2612],{"class":1246},[1048,2919,2886],{"class":1219},[1048,2921,2707],{"class":1258},[1048,2923,1165],{"class":1078},[1048,2925,1757],{"class":1285},[1048,2927,1165],{"class":1078},[1048,2929,2821],{"class":1258},[1048,2931,2932],{"class":1078},")),",[1048,2934,1325],{"class":1240},[1048,2936,1079],{"class":1078},[1048,2938,2256],{"class":1246},[1048,2940,1279],{"class":1078},[1048,2942,2944],{"class":1050,"line":2943},119,[1048,2945,1151],{"emptyLinePlaceholder":1150},[1048,2947,2949],{"class":1050,"line":2948},120,[1048,2950,2951],{"class":1054},"# Usage example\n",[1048,2953,2955,2957,2960,2962,2964,2966,2969],{"class":1050,"line":2954},121,[1048,2956,1158],{"class":1157},[1048,2958,2959],{"class":1161}," Product",[1048,2961,1165],{"class":1078},[1048,2963,1169],{"class":1168},[1048,2965,1079],{"class":1078},[1048,2967,2968],{"class":1168},"Model",[1048,2970,1177],{"class":1078},[1048,2972,2974,2977,2979,2981,2983,2985,2987,2990,2992,2995],{"class":1050,"line":2973},122,[1048,2975,2976],{"class":1065},"    name ",[1048,2978,1881],{"class":1078},[1048,2980,2453],{"class":1065},[1048,2982,1079],{"class":1078},[1048,2984,2458],{"class":1258},[1048,2986,1165],{"class":1078},[1048,2988,2989],{"class":2467},"max_length",[1048,2991,1881],{"class":1078},[1048,2993,2994],{"class":2284},"200",[1048,2996,1279],{"class":1078},[1048,2998,3000,3003,3005,3007,3010],{"class":1050,"line":2999},123,[1048,3001,3002],{"class":1065},"    price ",[1048,3004,1881],{"class":1078},[1048,3006,2173],{"class":1258},[1048,3008,3009],{"class":1078},"()",[1048,3011,3012],{"class":1054},"  # Automatically adds 'currency' field\n",[1048,3014,3016,3019,3021,3023],{"class":1050,"line":3015},124,[1048,3017,3018],{"class":1065},"    secret_data ",[1048,3020,1881],{"class":1078},[1048,3022,1162],{"class":1258},[1048,3024,1562],{"class":1078},[1048,3026,3028,3031,3033,3035,3037,3039],{"class":1050,"line":3027},125,[1048,3029,3030],{"class":1065},"    metadata ",[1048,3032,1881],{"class":1078},[1048,3034,1836],{"class":1258},[1048,3036,1165],{"class":1078},[1048,3038,1908],{"class":2467},[1048,3040,3041],{"class":1078},"={\n",[1048,3043,3045,3048,3051,3053,3056,3058,3061,3063],{"class":1050,"line":3044},126,[1048,3046,3047],{"class":1264},"        '",[1048,3049,3050],{"class":1268},"type",[1048,3052,1265],{"class":1264},[1048,3054,3055],{"class":1078},":",[1048,3057,1357],{"class":1264},[1048,3059,3060],{"class":1268},"object",[1048,3062,1265],{"class":1264},[1048,3064,2476],{"class":1078},[1048,3066,3068,3070,3073,3075,3077],{"class":1050,"line":3067},127,[1048,3069,3047],{"class":1264},[1048,3071,3072],{"class":1268},"properties",[1048,3074,1265],{"class":1264},[1048,3076,3055],{"class":1078},[1048,3078,3079],{"class":1078}," {\n",[1048,3081,3083,3086,3089,3091,3093,3095,3097,3099,3101,3103,3105,3108,3110],{"class":1050,"line":3082},128,[1048,3084,3085],{"class":1264},"            '",[1048,3087,3088],{"class":1268},"weight",[1048,3090,1265],{"class":1264},[1048,3092,3055],{"class":1078},[1048,3094,2774],{"class":1078},[1048,3096,1265],{"class":1264},[1048,3098,3050],{"class":1268},[1048,3100,1265],{"class":1264},[1048,3102,3055],{"class":1078},[1048,3104,1357],{"class":1264},[1048,3106,3107],{"class":1268},"number",[1048,3109,1265],{"class":1264},[1048,3111,3112],{"class":1078},"},\n",[1048,3114,3116,3118,3121,3123,3125],{"class":1050,"line":3115},129,[1048,3117,3085],{"class":1264},[1048,3119,3120],{"class":1268},"dimensions",[1048,3122,1265],{"class":1264},[1048,3124,3055],{"class":1078},[1048,3126,3079],{"class":1078},[1048,3128,3130,3133,3135,3137,3139,3141,3143,3145],{"class":1050,"line":3129},130,[1048,3131,3132],{"class":1264},"                '",[1048,3134,3050],{"class":1268},[1048,3136,1265],{"class":1264},[1048,3138,3055],{"class":1078},[1048,3140,1357],{"class":1264},[1048,3142,3060],{"class":1268},[1048,3144,1265],{"class":1264},[1048,3146,2476],{"class":1078},[1048,3148,3150,3152,3154,3156,3158],{"class":1050,"line":3149},131,[1048,3151,3132],{"class":1264},[1048,3153,3072],{"class":1268},[1048,3155,1265],{"class":1264},[1048,3157,3055],{"class":1078},[1048,3159,3079],{"class":1078},[1048,3161,3163,3166,3169,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189],{"class":1050,"line":3162},132,[1048,3164,3165],{"class":1264},"                    '",[1048,3167,3168],{"class":1268},"length",[1048,3170,1265],{"class":1264},[1048,3172,3055],{"class":1078},[1048,3174,2774],{"class":1078},[1048,3176,1265],{"class":1264},[1048,3178,3050],{"class":1268},[1048,3180,1265],{"class":1264},[1048,3182,3055],{"class":1078},[1048,3184,1357],{"class":1264},[1048,3186,3107],{"class":1268},[1048,3188,1265],{"class":1264},[1048,3190,3112],{"class":1078},[1048,3192,3194,3196,3199,3201,3203,3205,3207,3209,3211,3213,3215,3217,3219],{"class":1050,"line":3193},133,[1048,3195,3165],{"class":1264},[1048,3197,3198],{"class":1268},"width",[1048,3200,1265],{"class":1264},[1048,3202,3055],{"class":1078},[1048,3204,2774],{"class":1078},[1048,3206,1265],{"class":1264},[1048,3208,3050],{"class":1268},[1048,3210,1265],{"class":1264},[1048,3212,3055],{"class":1078},[1048,3214,1357],{"class":1264},[1048,3216,3107],{"class":1268},[1048,3218,1265],{"class":1264},[1048,3220,3112],{"class":1078},[1048,3222,3224,3226,3229,3231,3233,3235,3237,3239,3241,3243,3245,3247,3249],{"class":1050,"line":3223},134,[1048,3225,3165],{"class":1264},[1048,3227,3228],{"class":1268},"height",[1048,3230,1265],{"class":1264},[1048,3232,3055],{"class":1078},[1048,3234,2774],{"class":1078},[1048,3236,1265],{"class":1264},[1048,3238,3050],{"class":1268},[1048,3240,1265],{"class":1264},[1048,3242,3055],{"class":1078},[1048,3244,1357],{"class":1264},[1048,3246,3107],{"class":1268},[1048,3248,1265],{"class":1264},[1048,3250,3251],{"class":1078},"}\n",[1048,3253,3255],{"class":1050,"line":3254},135,[1048,3256,3257],{"class":1078},"                }\n",[1048,3259,3261],{"class":1050,"line":3260},136,[1048,3262,3263],{"class":1078},"            }\n",[1048,3265,3267],{"class":1050,"line":3266},137,[1048,3268,3269],{"class":1078},"        }\n",[1048,3271,3273],{"class":1050,"line":3272},138,[1048,3274,3275],{"class":1078},"    })\n",[1030,3277,3279],{"id":3278},"custom-database-backends","Custom Database Backends",[1026,3281,3282],{},"Custom database backends allow you to add support for new databases or modify existing database behavior.",[1038,3284,3286],{"className":1040,"code":3285,"language":1042,"meta":1043,"style":1043},"# Custom database backend for read/write splitting\nfrom django.db.backends.postgresql import base\nfrom django.db.backends.postgresql.base import DatabaseWrapper as PostgreSQLDatabaseWrapper\nimport random\n\nclass ReadWriteSplitDatabaseWrapper(PostgreSQLDatabaseWrapper):\n    \"\"\"Database wrapper that splits reads and writes\"\"\"\n    \n    def __init__(self, settings_dict, alias=None):\n        super().__init__(settings_dict, alias)\n        \n        # Configure read replicas\n        self.read_replicas = settings_dict.get('READ_REPLICAS', [])\n        self.write_db = settings_dict\n    \n    def _cursor(self, name=None):\n        \"\"\"Return cursor for read or write operations\"\"\"\n        # Determine if this is a read or write operation\n        if self._is_read_operation():\n            # Use read replica\n            if self.read_replicas:\n                replica_config = random.choice(self.read_replicas)\n                # Create connection to read replica\n                return self._create_replica_cursor(replica_config)\n        \n        # Use write database\n        return super()._cursor(name)\n    \n    def _is_read_operation(self):\n        \"\"\"Determine if current operation is read-only\"\"\"\n        # This is a simplified check - in practice, you'd need\n        # more sophisticated query analysis\n        import inspect\n        \n        frame = inspect.currentframe()\n        while frame:\n            if 'select' in str(frame.f_code.co_name).lower():\n                return True\n            if any(op in str(frame.f_code.co_name).lower() \n                   for op in ['insert', 'update', 'delete', 'create']):\n                return False\n            frame = frame.f_back\n        \n        return False\n    \n    def _create_replica_cursor(self, replica_config):\n        \"\"\"Create cursor for read replica\"\"\"\n        # Implementation would create connection to replica\n        # This is simplified for demonstration\n        pass\n\n# Custom database operations\nfrom django.db.backends.postgresql.operations import DatabaseOperations\n\nclass CustomDatabaseOperations(DatabaseOperations):\n    \"\"\"Custom database operations with additional functions\"\"\"\n    \n    def __init__(self, connection):\n        super().__init__(connection)\n        # Add custom SQL functions\n        self.custom_functions = {\n            'SIMILARITY': 'similarity(%s, %s)',\n            'LEVENSHTEIN': 'levenshtein(%s, %s)',\n            'METAPHONE': 'metaphone(%s)',\n        }\n    \n    def sql_function(self, function_name, *args):\n        \"\"\"Generate SQL for custom functions\"\"\"\n        if function_name in self.custom_functions:\n            template = self.custom_functions[function_name]\n            return template % args\n        \n        return super().sql_function(function_name, *args)\n\n# Database backend configuration\n# settings.py\nDATABASES = {\n    'default': {\n        'ENGINE': 'myapp.db_backends.read_write_split',\n        'NAME': 'myapp_write',\n        'USER': 'myuser',\n        'PASSWORD': 'mypass',\n        'HOST': 'write-db.example.com',\n        'PORT': '5432',\n        'READ_REPLICAS': [\n            {\n                'NAME': 'myapp_read1',\n                'HOST': 'read1-db.example.com',\n                'PORT': '5432',\n            },\n            {\n                'NAME': 'myapp_read2',\n                'HOST': 'read2-db.example.com',\n                'PORT': '5432',\n            }\n        ]\n    }\n}\n",[1045,3287,3288,3293,3319,3354,3361,3365,3379,3388,3392,3418,3437,3441,3446,3478,3492,3496,3517,3526,3531,3545,3550,3562,3587,3592,3611,3615,3620,3639,3643,3656,3665,3670,3675,3683,3687,3704,3714,3752,3759,3797,3847,3854,3868,3872,3878,3882,3900,3909,3914,3919,3924,3928,3933,3961,3965,3979,3988,3992,4008,4023,4028,4041,4071,4099,4123,4127,4131,4155,4164,4181,4203,4216,4220,4243,4247,4252,4257,4266,4280,4300,4320,4340,4360,4380,4400,4413,4418,4437,4456,4474,4479,4483,4502,4521,4539,4543,4548,4553],{"__ignoreMap":1043},[1048,3289,3290],{"class":1050,"line":1051},[1048,3291,3292],{"class":1054},"# Custom database backend for read/write splitting\n",[1048,3294,3295,3297,3299,3301,3304,3306,3309,3311,3314,3316],{"class":1050,"line":1058},[1048,3296,1072],{"class":1061},[1048,3298,1095],{"class":1065},[1048,3300,1079],{"class":1078},[1048,3302,3303],{"class":1065},"db",[1048,3305,1079],{"class":1078},[1048,3307,3308],{"class":1065},"backends",[1048,3310,1079],{"class":1078},[1048,3312,3313],{"class":1065},"postgresql ",[1048,3315,1062],{"class":1061},[1048,3317,3318],{"class":1065}," base\n",[1048,3320,3321,3323,3325,3327,3329,3331,3333,3335,3338,3340,3343,3345,3348,3351],{"class":1050,"line":1069},[1048,3322,1072],{"class":1061},[1048,3324,1095],{"class":1065},[1048,3326,1079],{"class":1078},[1048,3328,3303],{"class":1065},[1048,3330,1079],{"class":1078},[1048,3332,3308],{"class":1065},[1048,3334,1079],{"class":1078},[1048,3336,3337],{"class":1065},"postgresql",[1048,3339,1079],{"class":1078},[1048,3341,3342],{"class":1065},"base ",[1048,3344,1062],{"class":1061},[1048,3346,3347],{"class":1065}," DatabaseWrapper ",[1048,3349,3350],{"class":1061},"as",[1048,3352,3353],{"class":1065}," PostgreSQLDatabaseWrapper\n",[1048,3355,3356,3358],{"class":1050,"line":1090},[1048,3357,1062],{"class":1061},[1048,3359,3360],{"class":1065}," random\n",[1048,3362,3363],{"class":1050,"line":1108},[1048,3364,1151],{"emptyLinePlaceholder":1150},[1048,3366,3367,3369,3372,3374,3377],{"class":1050,"line":1130},[1048,3368,1158],{"class":1157},[1048,3370,3371],{"class":1161}," ReadWriteSplitDatabaseWrapper",[1048,3373,1165],{"class":1078},[1048,3375,3376],{"class":1168},"PostgreSQLDatabaseWrapper",[1048,3378,1177],{"class":1078},[1048,3380,3381,3383,3386],{"class":1050,"line":1147},[1048,3382,1184],{"class":1183},[1048,3384,3385],{"class":1187},"Database wrapper that splits reads and writes",[1048,3387,1191],{"class":1183},[1048,3389,3390],{"class":1050,"line":1154},[1048,3391,1197],{"class":1065},[1048,3393,3394,3396,3398,3400,3402,3404,3407,3409,3412,3414,3416],{"class":1050,"line":1180},[1048,3395,1203],{"class":1157},[1048,3397,1207],{"class":1206},[1048,3399,1165],{"class":1078},[1048,3401,1213],{"class":1212},[1048,3403,1216],{"class":1078},[1048,3405,3406],{"class":1223}," settings_dict",[1048,3408,1216],{"class":1078},[1048,3410,3411],{"class":1223}," alias",[1048,3413,1881],{"class":1219},[1048,3415,1884],{"class":1275},[1048,3417,1177],{"class":1078},[1048,3419,3420,3422,3424,3426,3428,3431,3433,3435],{"class":1050,"line":1194},[1048,3421,1286],{"class":1285},[1048,3423,1289],{"class":1078},[1048,3425,1292],{"class":1206},[1048,3427,1165],{"class":1078},[1048,3429,3430],{"class":1258},"settings_dict",[1048,3432,1216],{"class":1078},[1048,3434,3411],{"class":1258},[1048,3436,1279],{"class":1078},[1048,3438,3439],{"class":1050,"line":1200},[1048,3440,1313],{"class":1065},[1048,3442,3443],{"class":1050,"line":1237},[1048,3444,3445],{"class":1054},"        # Configure read replicas\n",[1048,3447,3448,3450,3452,3455,3457,3459,3461,3464,3466,3468,3471,3473,3475],{"class":1050,"line":1282},[1048,3449,1241],{"class":1240},[1048,3451,1079],{"class":1078},[1048,3453,3454],{"class":1246},"read_replicas",[1048,3456,1250],{"class":1078},[1048,3458,3406],{"class":1065},[1048,3460,1079],{"class":1078},[1048,3462,3463],{"class":1258},"get",[1048,3465,1165],{"class":1078},[1048,3467,1265],{"class":1264},[1048,3469,3470],{"class":1268},"READ_REPLICAS",[1048,3472,1265],{"class":1264},[1048,3474,1216],{"class":1078},[1048,3476,3477],{"class":1078}," [])\n",[1048,3479,3480,3482,3484,3487,3489],{"class":1050,"line":1310},[1048,3481,1241],{"class":1240},[1048,3483,1079],{"class":1078},[1048,3485,3486],{"class":1246},"write_db",[1048,3488,1250],{"class":1078},[1048,3490,3491],{"class":1065}," settings_dict\n",[1048,3493,3494],{"class":1050,"line":1316},[1048,3495,1197],{"class":1065},[1048,3497,3498,3500,3503,3505,3507,3509,3511,3513,3515],{"class":1050,"line":1335},[1048,3499,1203],{"class":1157},[1048,3501,3502],{"class":1458}," _cursor",[1048,3504,1165],{"class":1078},[1048,3506,1213],{"class":1212},[1048,3508,1216],{"class":1078},[1048,3510,2362],{"class":1223},[1048,3512,1881],{"class":1219},[1048,3514,1884],{"class":1275},[1048,3516,1177],{"class":1078},[1048,3518,3519,3521,3524],{"class":1050,"line":1371},[1048,3520,1486],{"class":1183},[1048,3522,3523],{"class":1187},"Return cursor for read or write operations",[1048,3525,1191],{"class":1183},[1048,3527,3528],{"class":1050,"line":1376},[1048,3529,3530],{"class":1054},"        # Determine if this is a read or write operation\n",[1048,3532,3533,3535,3537,3539,3542],{"class":1050,"line":1391},[1048,3534,1319],{"class":1061},[1048,3536,1325],{"class":1240},[1048,3538,1079],{"class":1078},[1048,3540,3541],{"class":1258},"_is_read_operation",[1048,3543,3544],{"class":1078},"():\n",[1048,3546,3547],{"class":1050,"line":1412},[1048,3548,3549],{"class":1054},"            # Use read replica\n",[1048,3551,3552,3554,3556,3558,3560],{"class":1050,"line":1417},[1048,3553,2833],{"class":1061},[1048,3555,1325],{"class":1240},[1048,3557,1079],{"class":1078},[1048,3559,3454],{"class":1246},[1048,3561,1332],{"class":1078},[1048,3563,3564,3567,3569,3572,3574,3577,3579,3581,3583,3585],{"class":1050,"line":1448},[1048,3565,3566],{"class":1065},"                replica_config ",[1048,3568,1881],{"class":1078},[1048,3570,3571],{"class":1065}," random",[1048,3573,1079],{"class":1078},[1048,3575,3576],{"class":1258},"choice",[1048,3578,1165],{"class":1078},[1048,3580,1213],{"class":1240},[1048,3582,1079],{"class":1078},[1048,3584,3454],{"class":1246},[1048,3586,1279],{"class":1078},[1048,3588,3589],{"class":1050,"line":1453},[1048,3590,3591],{"class":1054},"                # Create connection to read replica\n",[1048,3593,3594,3597,3599,3601,3604,3606,3609],{"class":1050,"line":1483},[1048,3595,3596],{"class":1061},"                return",[1048,3598,1325],{"class":1240},[1048,3600,1079],{"class":1078},[1048,3602,3603],{"class":1258},"_create_replica_cursor",[1048,3605,1165],{"class":1078},[1048,3607,3608],{"class":1258},"replica_config",[1048,3610,1279],{"class":1078},[1048,3612,3613],{"class":1050,"line":1494},[1048,3614,1313],{"class":1065},[1048,3616,3617],{"class":1050,"line":1509},[1048,3618,3619],{"class":1054},"        # Use write database\n",[1048,3621,3622,3624,3627,3629,3632,3634,3637],{"class":1050,"line":1518},[1048,3623,1663],{"class":1061},[1048,3625,3626],{"class":1285}," super",[1048,3628,1289],{"class":1078},[1048,3630,3631],{"class":1258},"_cursor",[1048,3633,1165],{"class":1078},[1048,3635,3636],{"class":1258},"name",[1048,3638,1279],{"class":1078},[1048,3640,3641],{"class":1050,"line":1523},[1048,3642,1197],{"class":1065},[1048,3644,3645,3647,3650,3652,3654],{"class":1050,"line":1531},[1048,3646,1203],{"class":1157},[1048,3648,3649],{"class":1458}," _is_read_operation",[1048,3651,1165],{"class":1078},[1048,3653,1213],{"class":1212},[1048,3655,1177],{"class":1078},[1048,3657,3658,3660,3663],{"class":1050,"line":1565},[1048,3659,1486],{"class":1183},[1048,3661,3662],{"class":1187},"Determine if current operation is read-only",[1048,3664,1191],{"class":1183},[1048,3666,3667],{"class":1050,"line":1576},[1048,3668,3669],{"class":1054},"        # This is a simplified check - in practice, you'd need\n",[1048,3671,3672],{"class":1050,"line":1582},[1048,3673,3674],{"class":1054},"        # more sophisticated query analysis\n",[1048,3676,3677,3680],{"class":1050,"line":1589},[1048,3678,3679],{"class":1061},"        import",[1048,3681,3682],{"class":1065}," inspect\n",[1048,3684,3685],{"class":1050,"line":1594},[1048,3686,1313],{"class":1065},[1048,3688,3689,3692,3694,3697,3699,3702],{"class":1050,"line":1612},[1048,3690,3691],{"class":1065},"        frame ",[1048,3693,1881],{"class":1078},[1048,3695,3696],{"class":1065}," inspect",[1048,3698,1079],{"class":1078},[1048,3700,3701],{"class":1258},"currentframe",[1048,3703,1562],{"class":1078},[1048,3705,3706,3709,3712],{"class":1050,"line":1622},[1048,3707,3708],{"class":1061},"        while",[1048,3710,3711],{"class":1065}," frame",[1048,3713,1332],{"class":1078},[1048,3715,3716,3718,3720,3723,3725,3728,3730,3732,3735,3737,3740,3742,3745,3747,3750],{"class":1050,"line":1653},[1048,3717,2833],{"class":1061},[1048,3719,1357],{"class":1264},[1048,3721,3722],{"class":1268},"select",[1048,3724,1265],{"class":1264},[1048,3726,3727],{"class":1219}," in",[1048,3729,1636],{"class":1285},[1048,3731,1165],{"class":1078},[1048,3733,3734],{"class":1258},"frame",[1048,3736,1079],{"class":1078},[1048,3738,3739],{"class":1246},"f_code",[1048,3741,1079],{"class":1078},[1048,3743,3744],{"class":1246},"co_name",[1048,3746,1764],{"class":1078},[1048,3748,3749],{"class":1258},"lower",[1048,3751,3544],{"class":1078},[1048,3753,3754,3756],{"class":1050,"line":1660},[1048,3755,3596],{"class":1061},[1048,3757,3758],{"class":1275}," True\n",[1048,3760,3761,3763,3766,3768,3771,3774,3776,3778,3780,3782,3784,3786,3788,3790,3792,3794],{"class":1050,"line":1674},[1048,3762,2833],{"class":1061},[1048,3764,3765],{"class":1206}," any",[1048,3767,1165],{"class":1078},[1048,3769,3770],{"class":1258},"op ",[1048,3772,3773],{"class":1061},"in",[1048,3775,1636],{"class":1285},[1048,3777,1165],{"class":1078},[1048,3779,3734],{"class":1258},[1048,3781,1079],{"class":1078},[1048,3783,3739],{"class":1246},[1048,3785,1079],{"class":1078},[1048,3787,3744],{"class":1246},[1048,3789,1764],{"class":1078},[1048,3791,3749],{"class":1258},[1048,3793,3009],{"class":1078},[1048,3795,3796],{"class":1258}," \n",[1048,3798,3799,3802,3805,3807,3810,3812,3815,3817,3819,3821,3824,3826,3828,3830,3833,3835,3837,3839,3842,3844],{"class":1050,"line":1679},[1048,3800,3801],{"class":1061},"                   for",[1048,3803,3804],{"class":1258}," op ",[1048,3806,3773],{"class":1061},[1048,3808,3809],{"class":1078}," [",[1048,3811,1265],{"class":1264},[1048,3813,3814],{"class":1268},"insert",[1048,3816,1265],{"class":1264},[1048,3818,1216],{"class":1078},[1048,3820,1357],{"class":1264},[1048,3822,3823],{"class":1268},"update",[1048,3825,1265],{"class":1264},[1048,3827,1216],{"class":1078},[1048,3829,1357],{"class":1264},[1048,3831,3832],{"class":1268},"delete",[1048,3834,1265],{"class":1264},[1048,3836,1216],{"class":1078},[1048,3838,1357],{"class":1264},[1048,3840,3841],{"class":1268},"create",[1048,3843,1265],{"class":1264},[1048,3845,3846],{"class":1078},"]):\n",[1048,3848,3849,3851],{"class":1050,"line":1697},[1048,3850,3596],{"class":1061},[1048,3852,3853],{"class":1275}," False\n",[1048,3855,3856,3859,3861,3863,3865],{"class":1050,"line":1707},[1048,3857,3858],{"class":1065},"            frame ",[1048,3860,1881],{"class":1078},[1048,3862,3711],{"class":1065},[1048,3864,1079],{"class":1078},[1048,3866,3867],{"class":1246},"f_back\n",[1048,3869,3870],{"class":1050,"line":1720},[1048,3871,1313],{"class":1065},[1048,3873,3874,3876],{"class":1050,"line":1727},[1048,3875,1663],{"class":1061},[1048,3877,3853],{"class":1275},[1048,3879,3880],{"class":1050,"line":1732},[1048,3881,1197],{"class":1065},[1048,3883,3884,3886,3889,3891,3893,3895,3898],{"class":1050,"line":1739},[1048,3885,1203],{"class":1157},[1048,3887,3888],{"class":1458}," _create_replica_cursor",[1048,3890,1165],{"class":1078},[1048,3892,1213],{"class":1212},[1048,3894,1216],{"class":1078},[1048,3896,3897],{"class":1223}," replica_config",[1048,3899,1177],{"class":1078},[1048,3901,3902,3904,3907],{"class":1050,"line":1775},[1048,3903,1486],{"class":1183},[1048,3905,3906],{"class":1187},"Create cursor for read replica",[1048,3908,1191],{"class":1183},[1048,3910,3911],{"class":1050,"line":1790},[1048,3912,3913],{"class":1054},"        # Implementation would create connection to replica\n",[1048,3915,3916],{"class":1050,"line":1820},[1048,3917,3918],{"class":1054},"        # This is simplified for demonstration\n",[1048,3920,3921],{"class":1050,"line":1825},[1048,3922,3923],{"class":1061},"        pass\n",[1048,3925,3926],{"class":1050,"line":1831},[1048,3927,1151],{"emptyLinePlaceholder":1150},[1048,3929,3930],{"class":1050,"line":1850},[1048,3931,3932],{"class":1054},"# Custom database operations\n",[1048,3934,3935,3937,3939,3941,3943,3945,3947,3949,3951,3953,3956,3958],{"class":1050,"line":1860},[1048,3936,1072],{"class":1061},[1048,3938,1095],{"class":1065},[1048,3940,1079],{"class":1078},[1048,3942,3303],{"class":1065},[1048,3944,1079],{"class":1078},[1048,3946,3308],{"class":1065},[1048,3948,1079],{"class":1078},[1048,3950,3337],{"class":1065},[1048,3952,1079],{"class":1078},[1048,3954,3955],{"class":1065},"operations ",[1048,3957,1062],{"class":1061},[1048,3959,3960],{"class":1065}," DatabaseOperations\n",[1048,3962,3963],{"class":1050,"line":1865},[1048,3964,1151],{"emptyLinePlaceholder":1150},[1048,3966,3967,3969,3972,3974,3977],{"class":1050,"line":1901},[1048,3968,1158],{"class":1157},[1048,3970,3971],{"class":1161}," CustomDatabaseOperations",[1048,3973,1165],{"class":1078},[1048,3975,3976],{"class":1168},"DatabaseOperations",[1048,3978,1177],{"class":1078},[1048,3980,3981,3983,3986],{"class":1050,"line":1916},[1048,3982,1184],{"class":1183},[1048,3984,3985],{"class":1187},"Custom database operations with additional functions",[1048,3987,1191],{"class":1183},[1048,3989,3990],{"class":1050,"line":1939},[1048,3991,1197],{"class":1065},[1048,3993,3994,3996,3998,4000,4002,4004,4006],{"class":1050,"line":1944},[1048,3995,1203],{"class":1157},[1048,3997,1207],{"class":1206},[1048,3999,1165],{"class":1078},[1048,4001,1213],{"class":1212},[1048,4003,1216],{"class":1078},[1048,4005,1478],{"class":1223},[1048,4007,1177],{"class":1078},[1048,4009,4010,4012,4014,4016,4018,4021],{"class":1050,"line":1967},[1048,4011,1286],{"class":1285},[1048,4013,1289],{"class":1078},[1048,4015,1292],{"class":1206},[1048,4017,1165],{"class":1078},[1048,4019,4020],{"class":1258},"connection",[1048,4022,1279],{"class":1078},[1048,4024,4025],{"class":1050,"line":1977},[1048,4026,4027],{"class":1054},"        # Add custom SQL functions\n",[1048,4029,4030,4032,4034,4037,4039],{"class":1050,"line":1997},[1048,4031,1241],{"class":1240},[1048,4033,1079],{"class":1078},[1048,4035,4036],{"class":1246},"custom_functions",[1048,4038,1250],{"class":1078},[1048,4040,3079],{"class":1078},[1048,4042,4043,4045,4048,4050,4052,4054,4057,4060,4063,4065,4067,4069],{"class":1050,"line":2002},[1048,4044,3085],{"class":1264},[1048,4046,4047],{"class":1268},"SIMILARITY",[1048,4049,1265],{"class":1264},[1048,4051,3055],{"class":1078},[1048,4053,1357],{"class":1264},[1048,4055,4056],{"class":1268},"similarity(",[1048,4058,4059],{"class":1806},"%s",[1048,4061,4062],{"class":1268},", ",[1048,4064,4059],{"class":1806},[1048,4066,1639],{"class":1268},[1048,4068,1265],{"class":1264},[1048,4070,2476],{"class":1078},[1048,4072,4073,4075,4078,4080,4082,4084,4087,4089,4091,4093,4095,4097],{"class":1050,"line":2026},[1048,4074,3085],{"class":1264},[1048,4076,4077],{"class":1268},"LEVENSHTEIN",[1048,4079,1265],{"class":1264},[1048,4081,3055],{"class":1078},[1048,4083,1357],{"class":1264},[1048,4085,4086],{"class":1268},"levenshtein(",[1048,4088,4059],{"class":1806},[1048,4090,4062],{"class":1268},[1048,4092,4059],{"class":1806},[1048,4094,1639],{"class":1268},[1048,4096,1265],{"class":1264},[1048,4098,2476],{"class":1078},[1048,4100,4101,4103,4106,4108,4110,4112,4115,4117,4119,4121],{"class":1050,"line":2034},[1048,4102,3085],{"class":1264},[1048,4104,4105],{"class":1268},"METAPHONE",[1048,4107,1265],{"class":1264},[1048,4109,3055],{"class":1078},[1048,4111,1357],{"class":1264},[1048,4113,4114],{"class":1268},"metaphone(",[1048,4116,4059],{"class":1806},[1048,4118,1639],{"class":1268},[1048,4120,1265],{"class":1264},[1048,4122,2476],{"class":1078},[1048,4124,4125],{"class":1050,"line":2043},[1048,4126,3269],{"class":1078},[1048,4128,4129],{"class":1050,"line":2067},[1048,4130,1197],{"class":1065},[1048,4132,4133,4135,4138,4140,4142,4144,4147,4149,4151,4153],{"class":1050,"line":2087},[1048,4134,1203],{"class":1157},[1048,4136,4137],{"class":1458}," sql_function",[1048,4139,1165],{"class":1078},[1048,4141,1213],{"class":1212},[1048,4143,1216],{"class":1078},[1048,4145,4146],{"class":1223}," function_name",[1048,4148,1216],{"class":1078},[1048,4150,1220],{"class":1219},[1048,4152,1224],{"class":1223},[1048,4154,1177],{"class":1078},[1048,4156,4157,4159,4162],{"class":1050,"line":2117},[1048,4158,1486],{"class":1183},[1048,4160,4161],{"class":1187},"Generate SQL for custom functions",[1048,4163,1191],{"class":1183},[1048,4165,4166,4168,4171,4173,4175,4177,4179],{"class":1050,"line":2127},[1048,4167,1319],{"class":1061},[1048,4169,4170],{"class":1065}," function_name ",[1048,4172,3773],{"class":1219},[1048,4174,1325],{"class":1240},[1048,4176,1079],{"class":1078},[1048,4178,4036],{"class":1246},[1048,4180,1332],{"class":1078},[1048,4182,4183,4186,4188,4190,4192,4194,4197,4200],{"class":1050,"line":2133},[1048,4184,4185],{"class":1065},"            template ",[1048,4187,1881],{"class":1078},[1048,4189,1325],{"class":1240},[1048,4191,1079],{"class":1078},[1048,4193,4036],{"class":1246},[1048,4195,4196],{"class":1078},"[",[1048,4198,4199],{"class":1246},"function_name",[1048,4201,4202],{"class":1078},"]\n",[1048,4204,4205,4207,4210,4213],{"class":1050,"line":2139},[1048,4206,1512],{"class":1061},[1048,4208,4209],{"class":1065}," template ",[1048,4211,4212],{"class":1219},"%",[1048,4214,4215],{"class":1065}," args\n",[1048,4217,4218],{"class":1050,"line":2144},[1048,4219,1313],{"class":1065},[1048,4221,4222,4224,4226,4228,4231,4233,4235,4237,4239,4241],{"class":1050,"line":2150},[1048,4223,1663],{"class":1061},[1048,4225,3626],{"class":1285},[1048,4227,1289],{"class":1078},[1048,4229,4230],{"class":1258},"sql_function",[1048,4232,1165],{"class":1078},[1048,4234,4199],{"class":1258},[1048,4236,1216],{"class":1078},[1048,4238,1220],{"class":1219},[1048,4240,1224],{"class":1258},[1048,4242,1279],{"class":1078},[1048,4244,4245],{"class":1050,"line":2163},[1048,4246,1151],{"emptyLinePlaceholder":1150},[1048,4248,4249],{"class":1050,"line":2168},[1048,4250,4251],{"class":1054},"# Database backend configuration\n",[1048,4253,4254],{"class":1050,"line":2187},[1048,4255,4256],{"class":1054},"# settings.py\n",[1048,4258,4259,4262,4264],{"class":1050,"line":2197},[1048,4260,4261],{"class":1240},"DATABASES",[1048,4263,1250],{"class":1078},[1048,4265,3079],{"class":1078},[1048,4267,4268,4271,4274,4276,4278],{"class":1050,"line":2202},[1048,4269,4270],{"class":1264},"    '",[1048,4272,4273],{"class":1268},"default",[1048,4275,1265],{"class":1264},[1048,4277,3055],{"class":1078},[1048,4279,3079],{"class":1078},[1048,4281,4282,4284,4287,4289,4291,4293,4296,4298],{"class":1050,"line":2236},[1048,4283,3047],{"class":1264},[1048,4285,4286],{"class":1268},"ENGINE",[1048,4288,1265],{"class":1264},[1048,4290,3055],{"class":1078},[1048,4292,1357],{"class":1264},[1048,4294,4295],{"class":1268},"myapp.db_backends.read_write_split",[1048,4297,1265],{"class":1264},[1048,4299,2476],{"class":1078},[1048,4301,4302,4304,4307,4309,4311,4313,4316,4318],{"class":1050,"line":2262},[1048,4303,3047],{"class":1264},[1048,4305,4306],{"class":1268},"NAME",[1048,4308,1265],{"class":1264},[1048,4310,3055],{"class":1078},[1048,4312,1357],{"class":1264},[1048,4314,4315],{"class":1268},"myapp_write",[1048,4317,1265],{"class":1264},[1048,4319,2476],{"class":1078},[1048,4321,4322,4324,4327,4329,4331,4333,4336,4338],{"class":1050,"line":2290},[1048,4323,3047],{"class":1264},[1048,4325,4326],{"class":1268},"USER",[1048,4328,1265],{"class":1264},[1048,4330,3055],{"class":1078},[1048,4332,1357],{"class":1264},[1048,4334,4335],{"class":1268},"myuser",[1048,4337,1265],{"class":1264},[1048,4339,2476],{"class":1078},[1048,4341,4342,4344,4347,4349,4351,4353,4356,4358],{"class":1050,"line":2315},[1048,4343,3047],{"class":1264},[1048,4345,4346],{"class":1268},"PASSWORD",[1048,4348,1265],{"class":1264},[1048,4350,3055],{"class":1078},[1048,4352,1357],{"class":1264},[1048,4354,4355],{"class":1268},"mypass",[1048,4357,1265],{"class":1264},[1048,4359,2476],{"class":1078},[1048,4361,4362,4364,4367,4369,4371,4373,4376,4378],{"class":1050,"line":2338},[1048,4363,3047],{"class":1264},[1048,4365,4366],{"class":1268},"HOST",[1048,4368,1265],{"class":1264},[1048,4370,3055],{"class":1078},[1048,4372,1357],{"class":1264},[1048,4374,4375],{"class":1268},"write-db.example.com",[1048,4377,1265],{"class":1264},[1048,4379,2476],{"class":1078},[1048,4381,4382,4384,4387,4389,4391,4393,4396,4398],{"class":1050,"line":2343},[1048,4383,3047],{"class":1264},[1048,4385,4386],{"class":1268},"PORT",[1048,4388,1265],{"class":1264},[1048,4390,3055],{"class":1078},[1048,4392,1357],{"class":1264},[1048,4394,4395],{"class":1268},"5432",[1048,4397,1265],{"class":1264},[1048,4399,2476],{"class":1078},[1048,4401,4402,4404,4406,4408,4410],{"class":1050,"line":2373},[1048,4403,3047],{"class":1264},[1048,4405,3470],{"class":1268},[1048,4407,1265],{"class":1264},[1048,4409,3055],{"class":1078},[1048,4411,4412],{"class":1078}," [\n",[1048,4414,4415],{"class":1050,"line":2383},[1048,4416,4417],{"class":1078},"            {\n",[1048,4419,4420,4422,4424,4426,4428,4430,4433,4435],{"class":1050,"line":2410},[1048,4421,3132],{"class":1264},[1048,4423,4306],{"class":1268},[1048,4425,1265],{"class":1264},[1048,4427,3055],{"class":1078},[1048,4429,1357],{"class":1264},[1048,4431,4432],{"class":1268},"myapp_read1",[1048,4434,1265],{"class":1264},[1048,4436,2476],{"class":1078},[1048,4438,4439,4441,4443,4445,4447,4449,4452,4454],{"class":1050,"line":2415},[1048,4440,3132],{"class":1264},[1048,4442,4366],{"class":1268},[1048,4444,1265],{"class":1264},[1048,4446,3055],{"class":1078},[1048,4448,1357],{"class":1264},[1048,4450,4451],{"class":1268},"read1-db.example.com",[1048,4453,1265],{"class":1264},[1048,4455,2476],{"class":1078},[1048,4457,4458,4460,4462,4464,4466,4468,4470,4472],{"class":1050,"line":2421},[1048,4459,3132],{"class":1264},[1048,4461,4386],{"class":1268},[1048,4463,1265],{"class":1264},[1048,4465,3055],{"class":1078},[1048,4467,1357],{"class":1264},[1048,4469,4395],{"class":1268},[1048,4471,1265],{"class":1264},[1048,4473,2476],{"class":1078},[1048,4475,4476],{"class":1050,"line":2445},[1048,4477,4478],{"class":1078},"            },\n",[1048,4480,4481],{"class":1050,"line":2464},[1048,4482,4417],{"class":1078},[1048,4484,4485,4487,4489,4491,4493,4495,4498,4500],{"class":1050,"line":2479},[1048,4486,3132],{"class":1264},[1048,4488,4306],{"class":1268},[1048,4490,1265],{"class":1264},[1048,4492,3055],{"class":1078},[1048,4494,1357],{"class":1264},[1048,4496,4497],{"class":1268},"myapp_read2",[1048,4499,1265],{"class":1264},[1048,4501,2476],{"class":1078},[1048,4503,4504,4506,4508,4510,4512,4514,4517,4519],{"class":1050,"line":2496},[1048,4505,3132],{"class":1264},[1048,4507,4366],{"class":1268},[1048,4509,1265],{"class":1264},[1048,4511,3055],{"class":1078},[1048,4513,1357],{"class":1264},[1048,4515,4516],{"class":1268},"read2-db.example.com",[1048,4518,1265],{"class":1264},[1048,4520,2476],{"class":1078},[1048,4522,4523,4525,4527,4529,4531,4533,4535,4537],{"class":1050,"line":2511},[1048,4524,3132],{"class":1264},[1048,4526,4386],{"class":1268},[1048,4528,1265],{"class":1264},[1048,4530,3055],{"class":1078},[1048,4532,1357],{"class":1264},[1048,4534,4395],{"class":1268},[1048,4536,1265],{"class":1264},[1048,4538,2476],{"class":1078},[1048,4540,4541],{"class":1050,"line":2517},[1048,4542,3263],{"class":1078},[1048,4544,4545],{"class":1050,"line":2541},[1048,4546,4547],{"class":1078},"        ]\n",[1048,4549,4550],{"class":1050,"line":2546},[1048,4551,4552],{"class":1078},"    }\n",[1048,4554,4555],{"class":1050,"line":2571},[1048,4556,3251],{"class":1078},[1030,4558,4560],{"id":4559},"custom-authentication-backends","Custom Authentication Backends",[1026,4562,4563],{},"Custom authentication backends enable integration with external authentication systems and custom authentication logic.",[1038,4565,4567],{"className":1040,"code":4566,"language":1042,"meta":1043,"style":1043},"# Multi-factor authentication backend\nfrom django.contrib.auth.backends import BaseBackend\nfrom django.contrib.auth.models import User\nfrom django.core.cache import cache\nimport pyotp\nimport qrcode\nfrom io import BytesIO\nimport base64\n\nclass MultiFactorAuthBackend(BaseBackend):\n    \"\"\"Authentication backend with MFA support\"\"\"\n    \n    def authenticate(self, request, username=None, password=None, mfa_token=None, **kwargs):\n        \"\"\"Authenticate user with MFA\"\"\"\n        try:\n            user = User.objects.get(username=username)\n        except User.DoesNotExist:\n            return None\n        \n        # Check password\n        if not user.check_password(password):\n            return None\n        \n        # Check if MFA is required\n        if self.requires_mfa(user):\n            if not mfa_token:\n                # Store partial authentication in cache\n                cache.set(f'mfa_pending_{username}', True, timeout=300)\n                return None\n            \n            # Verify MFA token\n            if not self.verify_mfa_token(user, mfa_token):\n                return None\n            \n            # Clear MFA pending status\n            cache.delete(f'mfa_pending_{username}')\n        \n        return user\n    \n    def requires_mfa(self, user):\n        \"\"\"Check if user requires MFA\"\"\"\n        return hasattr(user, 'mfa_profile') and user.mfa_profile.is_enabled\n    \n    def verify_mfa_token(self, user, token):\n        \"\"\"Verify MFA token\"\"\"\n        if not hasattr(user, 'mfa_profile'):\n            return False\n        \n        totp = pyotp.TOTP(user.mfa_profile.secret_key)\n        return totp.verify(token, valid_window=1)\n    \n    def get_user(self, user_id):\n        \"\"\"Get user by ID\"\"\"\n        try:\n            return User.objects.get(pk=user_id)\n        except User.DoesNotExist:\n            return None\n\n# MFA Profile model\nclass MFAProfile(models.Model):\n    \"\"\"Multi-factor authentication profile\"\"\"\n    \n    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='mfa_profile')\n    secret_key = models.CharField(max_length=32, blank=True)\n    is_enabled = models.BooleanField(default=False)\n    backup_codes = models.JSONField(default=list)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    def generate_secret_key(self):\n        \"\"\"Generate new secret key\"\"\"\n        self.secret_key = pyotp.random_base32()\n        self.save()\n    \n    def get_qr_code(self):\n        \"\"\"Generate QR code for MFA setup\"\"\"\n        if not self.secret_key:\n            self.generate_secret_key()\n        \n        totp = pyotp.TOTP(self.secret_key)\n        provisioning_uri = totp.provisioning_uri(\n            name=self.user.email,\n            issuer_name=\"MyApp\"\n        )\n        \n        qr = qrcode.QRCode(version=1, box_size=10, border=5)\n        qr.add_data(provisioning_uri)\n        qr.make(fit=True)\n        \n        img = qr.make_image(fill_color=\"black\", back_color=\"white\")\n        buffer = BytesIO()\n        img.save(buffer, format='PNG')\n        \n        return base64.b64encode(buffer.getvalue()).decode()\n    \n    def generate_backup_codes(self):\n        \"\"\"Generate backup codes\"\"\"\n        import secrets\n        codes = [secrets.token_hex(4).upper() for _ in range(10)]\n        self.backup_codes = codes\n        self.save()\n        return codes\n\n# LDAP authentication backend\nimport ldap\nfrom django_auth_ldap.backend import LDAPBackend\n\nclass CustomLDAPBackend(LDAPBackend):\n    \"\"\"Custom LDAP backend with additional features\"\"\"\n    \n    def authenticate_ldap_user(self, ldap_user, password):\n        \"\"\"Authenticate LDAP user with custom logic\"\"\"\n        user = super().authenticate_ldap_user(ldap_user, password)\n        \n        if user:\n            # Sync additional LDAP attributes\n            self.sync_user_attributes(user, ldap_user)\n            \n            # Check group membership\n            if not self.check_group_membership(ldap_user):\n                return None\n        \n        return user\n    \n    def sync_user_attributes(self, user, ldap_user):\n        \"\"\"Sync additional attributes from LDAP\"\"\"\n        ldap_attrs = ldap_user.attrs\n        \n        # Sync department\n        if 'department' in ldap_attrs:\n            user.profile.department = ldap_attrs['department'][0]\n        \n        # Sync manager\n        if 'manager' in ldap_attrs:\n            manager_dn = ldap_attrs['manager'][0]\n            # Look up manager user\n            try:\n                manager = User.objects.get(username=self.extract_username_from_dn(manager_dn))\n                user.profile.manager = manager\n            except User.DoesNotExist:\n                pass\n        \n        user.profile.save()\n    \n    def check_group_membership(self, ldap_user):\n        \"\"\"Check if user is member of required groups\"\"\"\n        required_groups = getattr(settings, 'LDAP_REQUIRED_GROUPS', [])\n        \n        if not required_groups:\n            return True\n        \n        user_groups = ldap_user.group_names\n        return any(group in user_groups for group in required_groups)\n",[1045,4568,4569,4574,4600,4624,4644,4651,4658,4670,4677,4681,4695,4704,4708,4759,4768,4774,4804,4817,4823,4827,4832,4853,4859,4863,4868,4886,4896,4901,4943,4949,4954,4959,4982,4988,4992,4997,5022,5026,5033,5037,5054,5063,5097,5101,5123,5132,5154,5160,5164,5194,5223,5227,5245,5254,5260,5286,5298,5304,5308,5313,5330,5339,5343,5392,5426,5451,5475,5500,5504,5517,5526,5545,5556,5560,5573,5582,5596,5607,5611,5633,5649,5669,5683,5688,5692,5738,5754,5774,5778,5823,5835,5865,5869,5896,5900,5913,5922,5929,5976,5990,6000,6006,6010,6015,6022,6039,6043,6057,6066,6070,6092,6101,6126,6130,6138,6143,6162,6166,6171,6190,6196,6200,6206,6210,6231,6240,6254,6258,6263,6281,6315,6319,6324,6341,6364,6369,6375,6412,6430,6443,6448,6453,6469,6474,6492,6502,6529,6534,6546,6553,6558,6573],{"__ignoreMap":1043},[1048,4570,4571],{"class":1050,"line":1051},[1048,4572,4573],{"class":1054},"# Multi-factor authentication backend\n",[1048,4575,4576,4578,4580,4582,4585,4587,4590,4592,4595,4597],{"class":1050,"line":1058},[1048,4577,1072],{"class":1061},[1048,4579,1095],{"class":1065},[1048,4581,1079],{"class":1078},[1048,4583,4584],{"class":1065},"contrib",[1048,4586,1079],{"class":1078},[1048,4588,4589],{"class":1065},"auth",[1048,4591,1079],{"class":1078},[1048,4593,4594],{"class":1065},"backends ",[1048,4596,1062],{"class":1061},[1048,4598,4599],{"class":1065}," BaseBackend\n",[1048,4601,4602,4604,4606,4608,4610,4612,4614,4616,4619,4621],{"class":1050,"line":1069},[1048,4603,1072],{"class":1061},[1048,4605,1095],{"class":1065},[1048,4607,1079],{"class":1078},[1048,4609,4584],{"class":1065},[1048,4611,1079],{"class":1078},[1048,4613,4589],{"class":1065},[1048,4615,1079],{"class":1078},[1048,4617,4618],{"class":1065},"models ",[1048,4620,1062],{"class":1061},[1048,4622,4623],{"class":1065}," User\n",[1048,4625,4626,4628,4630,4632,4634,4636,4639,4641],{"class":1050,"line":1090},[1048,4627,1072],{"class":1061},[1048,4629,1095],{"class":1065},[1048,4631,1079],{"class":1078},[1048,4633,1117],{"class":1065},[1048,4635,1079],{"class":1078},[1048,4637,4638],{"class":1065},"cache ",[1048,4640,1062],{"class":1061},[1048,4642,4643],{"class":1065}," cache\n",[1048,4645,4646,4648],{"class":1050,"line":1108},[1048,4647,1062],{"class":1061},[1048,4649,4650],{"class":1065}," pyotp\n",[1048,4652,4653,4655],{"class":1050,"line":1130},[1048,4654,1062],{"class":1061},[1048,4656,4657],{"class":1065}," qrcode\n",[1048,4659,4660,4662,4665,4667],{"class":1050,"line":1147},[1048,4661,1072],{"class":1061},[1048,4663,4664],{"class":1065}," io ",[1048,4666,1062],{"class":1061},[1048,4668,4669],{"class":1065}," BytesIO\n",[1048,4671,4672,4674],{"class":1050,"line":1154},[1048,4673,1062],{"class":1061},[1048,4675,4676],{"class":1065}," base64\n",[1048,4678,4679],{"class":1050,"line":1180},[1048,4680,1151],{"emptyLinePlaceholder":1150},[1048,4682,4683,4685,4688,4690,4693],{"class":1050,"line":1194},[1048,4684,1158],{"class":1157},[1048,4686,4687],{"class":1161}," MultiFactorAuthBackend",[1048,4689,1165],{"class":1078},[1048,4691,4692],{"class":1168},"BaseBackend",[1048,4694,1177],{"class":1078},[1048,4696,4697,4699,4702],{"class":1050,"line":1200},[1048,4698,1184],{"class":1183},[1048,4700,4701],{"class":1187},"Authentication backend with MFA support",[1048,4703,1191],{"class":1183},[1048,4705,4706],{"class":1050,"line":1237},[1048,4707,1197],{"class":1065},[1048,4709,4710,4712,4715,4717,4719,4721,4724,4726,4729,4731,4733,4735,4738,4740,4742,4744,4747,4749,4751,4753,4755,4757],{"class":1050,"line":1282},[1048,4711,1203],{"class":1157},[1048,4713,4714],{"class":1458}," authenticate",[1048,4716,1165],{"class":1078},[1048,4718,1213],{"class":1212},[1048,4720,1216],{"class":1078},[1048,4722,4723],{"class":1223}," request",[1048,4725,1216],{"class":1078},[1048,4727,4728],{"class":1223}," username",[1048,4730,1881],{"class":1219},[1048,4732,1884],{"class":1275},[1048,4734,1216],{"class":1078},[1048,4736,4737],{"class":1223}," password",[1048,4739,1881],{"class":1219},[1048,4741,1884],{"class":1275},[1048,4743,1216],{"class":1078},[1048,4745,4746],{"class":1223}," mfa_token",[1048,4748,1881],{"class":1219},[1048,4750,1884],{"class":1275},[1048,4752,1216],{"class":1078},[1048,4754,1229],{"class":1219},[1048,4756,1232],{"class":1223},[1048,4758,1177],{"class":1078},[1048,4760,4761,4763,4766],{"class":1050,"line":1310},[1048,4762,1486],{"class":1183},[1048,4764,4765],{"class":1187},"Authenticate user with MFA",[1048,4767,1191],{"class":1183},[1048,4769,4770,4772],{"class":1050,"line":1316},[1048,4771,1526],{"class":1061},[1048,4773,1332],{"class":1078},[1048,4775,4776,4779,4781,4784,4786,4789,4791,4793,4795,4798,4800,4802],{"class":1050,"line":1335},[1048,4777,4778],{"class":1065},"            user ",[1048,4780,1881],{"class":1078},[1048,4782,4783],{"class":1065}," User",[1048,4785,1079],{"class":1078},[1048,4787,4788],{"class":1246},"objects",[1048,4790,1079],{"class":1078},[1048,4792,3463],{"class":1258},[1048,4794,1165],{"class":1078},[1048,4796,4797],{"class":2467},"username",[1048,4799,1881],{"class":1078},[1048,4801,4797],{"class":1258},[1048,4803,1279],{"class":1078},[1048,4805,4806,4808,4810,4812,4815],{"class":1050,"line":1371},[1048,4807,1568],{"class":1061},[1048,4809,4783],{"class":1065},[1048,4811,1079],{"class":1078},[1048,4813,4814],{"class":1246},"DoesNotExist",[1048,4816,1332],{"class":1078},[1048,4818,4819,4821],{"class":1050,"line":1376},[1048,4820,1512],{"class":1061},[1048,4822,2599],{"class":1275},[1048,4824,4825],{"class":1050,"line":1391},[1048,4826,1313],{"class":1065},[1048,4828,4829],{"class":1050,"line":1412},[1048,4830,4831],{"class":1054},"        # Check password\n",[1048,4833,4834,4836,4838,4841,4843,4846,4848,4851],{"class":1050,"line":1417},[1048,4835,1319],{"class":1061},[1048,4837,1322],{"class":1219},[1048,4839,4840],{"class":1065}," user",[1048,4842,1079],{"class":1078},[1048,4844,4845],{"class":1258},"check_password",[1048,4847,1165],{"class":1078},[1048,4849,4850],{"class":1258},"password",[1048,4852,1177],{"class":1078},[1048,4854,4855,4857],{"class":1050,"line":1448},[1048,4856,1512],{"class":1061},[1048,4858,2599],{"class":1275},[1048,4860,4861],{"class":1050,"line":1453},[1048,4862,1313],{"class":1065},[1048,4864,4865],{"class":1050,"line":1483},[1048,4866,4867],{"class":1054},"        # Check if MFA is required\n",[1048,4869,4870,4872,4874,4876,4879,4881,4884],{"class":1050,"line":1494},[1048,4871,1319],{"class":1061},[1048,4873,1325],{"class":1240},[1048,4875,1079],{"class":1078},[1048,4877,4878],{"class":1258},"requires_mfa",[1048,4880,1165],{"class":1078},[1048,4882,4883],{"class":1258},"user",[1048,4885,1177],{"class":1078},[1048,4887,4888,4890,4892,4894],{"class":1050,"line":1509},[1048,4889,2833],{"class":1061},[1048,4891,1322],{"class":1219},[1048,4893,4746],{"class":1065},[1048,4895,1332],{"class":1078},[1048,4897,4898],{"class":1050,"line":1518},[1048,4899,4900],{"class":1054},"                # Store partial authentication in cache\n",[1048,4902,4903,4906,4908,4911,4913,4915,4918,4920,4922,4924,4926,4928,4931,4933,4936,4938,4941],{"class":1050,"line":1523},[1048,4904,4905],{"class":1065},"                cache",[1048,4907,1079],{"class":1078},[1048,4909,4910],{"class":1258},"set",[1048,4912,1165],{"class":1078},[1048,4914,1800],{"class":1157},[1048,4916,4917],{"class":1268},"'mfa_pending_",[1048,4919,1807],{"class":1806},[1048,4921,4797],{"class":1258},[1048,4923,1813],{"class":1806},[1048,4925,1265],{"class":1268},[1048,4927,1216],{"class":1078},[1048,4929,4930],{"class":1275}," True",[1048,4932,1216],{"class":1078},[1048,4934,4935],{"class":2467}," timeout",[1048,4937,1881],{"class":1078},[1048,4939,4940],{"class":2284},"300",[1048,4942,1279],{"class":1078},[1048,4944,4945,4947],{"class":1050,"line":1531},[1048,4946,3596],{"class":1061},[1048,4948,2599],{"class":1275},[1048,4950,4951],{"class":1050,"line":1565},[1048,4952,4953],{"class":1065},"            \n",[1048,4955,4956],{"class":1050,"line":1576},[1048,4957,4958],{"class":1054},"            # Verify MFA token\n",[1048,4960,4961,4963,4965,4967,4969,4972,4974,4976,4978,4980],{"class":1050,"line":1582},[1048,4962,2833],{"class":1061},[1048,4964,1322],{"class":1219},[1048,4966,1325],{"class":1240},[1048,4968,1079],{"class":1078},[1048,4970,4971],{"class":1258},"verify_mfa_token",[1048,4973,1165],{"class":1078},[1048,4975,4883],{"class":1258},[1048,4977,1216],{"class":1078},[1048,4979,4746],{"class":1258},[1048,4981,1177],{"class":1078},[1048,4983,4984,4986],{"class":1050,"line":1589},[1048,4985,3596],{"class":1061},[1048,4987,2599],{"class":1275},[1048,4989,4990],{"class":1050,"line":1594},[1048,4991,4953],{"class":1065},[1048,4993,4994],{"class":1050,"line":1612},[1048,4995,4996],{"class":1054},"            # Clear MFA pending status\n",[1048,4998,4999,5002,5004,5006,5008,5010,5012,5014,5016,5018,5020],{"class":1050,"line":1622},[1048,5000,5001],{"class":1065},"            cache",[1048,5003,1079],{"class":1078},[1048,5005,3832],{"class":1258},[1048,5007,1165],{"class":1078},[1048,5009,1800],{"class":1157},[1048,5011,4917],{"class":1268},[1048,5013,1807],{"class":1806},[1048,5015,4797],{"class":1258},[1048,5017,1813],{"class":1806},[1048,5019,1265],{"class":1268},[1048,5021,1279],{"class":1078},[1048,5023,5024],{"class":1050,"line":1653},[1048,5025,1313],{"class":1065},[1048,5027,5028,5030],{"class":1050,"line":1660},[1048,5029,1663],{"class":1061},[1048,5031,5032],{"class":1065}," user\n",[1048,5034,5035],{"class":1050,"line":1674},[1048,5036,1197],{"class":1065},[1048,5038,5039,5041,5044,5046,5048,5050,5052],{"class":1050,"line":1679},[1048,5040,1203],{"class":1157},[1048,5042,5043],{"class":1458}," requires_mfa",[1048,5045,1165],{"class":1078},[1048,5047,1213],{"class":1212},[1048,5049,1216],{"class":1078},[1048,5051,4840],{"class":1223},[1048,5053,1177],{"class":1078},[1048,5055,5056,5058,5061],{"class":1050,"line":1697},[1048,5057,1486],{"class":1183},[1048,5059,5060],{"class":1187},"Check if user requires MFA",[1048,5062,1191],{"class":1183},[1048,5064,5065,5067,5069,5071,5073,5075,5077,5080,5082,5084,5086,5088,5090,5092,5094],{"class":1050,"line":1707},[1048,5066,1663],{"class":1061},[1048,5068,2428],{"class":1206},[1048,5070,1165],{"class":1078},[1048,5072,4883],{"class":1258},[1048,5074,1216],{"class":1078},[1048,5076,1357],{"class":1264},[1048,5078,5079],{"class":1268},"mfa_profile",[1048,5081,1265],{"class":1264},[1048,5083,1639],{"class":1078},[1048,5085,2013],{"class":1219},[1048,5087,4840],{"class":1065},[1048,5089,1079],{"class":1078},[1048,5091,5079],{"class":1246},[1048,5093,1079],{"class":1078},[1048,5095,5096],{"class":1246},"is_enabled\n",[1048,5098,5099],{"class":1050,"line":1720},[1048,5100,1197],{"class":1065},[1048,5102,5103,5105,5108,5110,5112,5114,5116,5118,5121],{"class":1050,"line":1727},[1048,5104,1203],{"class":1157},[1048,5106,5107],{"class":1458}," verify_mfa_token",[1048,5109,1165],{"class":1078},[1048,5111,1213],{"class":1212},[1048,5113,1216],{"class":1078},[1048,5115,4840],{"class":1223},[1048,5117,1216],{"class":1078},[1048,5119,5120],{"class":1223}," token",[1048,5122,1177],{"class":1078},[1048,5124,5125,5127,5130],{"class":1050,"line":1732},[1048,5126,1486],{"class":1183},[1048,5128,5129],{"class":1187},"Verify MFA token",[1048,5131,1191],{"class":1183},[1048,5133,5134,5136,5138,5140,5142,5144,5146,5148,5150,5152],{"class":1050,"line":1739},[1048,5135,1319],{"class":1061},[1048,5137,1322],{"class":1219},[1048,5139,2428],{"class":1206},[1048,5141,1165],{"class":1078},[1048,5143,4883],{"class":1258},[1048,5145,1216],{"class":1078},[1048,5147,1357],{"class":1264},[1048,5149,5079],{"class":1268},[1048,5151,1265],{"class":1264},[1048,5153,1177],{"class":1078},[1048,5155,5156,5158],{"class":1050,"line":1775},[1048,5157,1512],{"class":1061},[1048,5159,3853],{"class":1275},[1048,5161,5162],{"class":1050,"line":1790},[1048,5163,1313],{"class":1065},[1048,5165,5166,5169,5171,5174,5176,5179,5181,5183,5185,5187,5189,5192],{"class":1050,"line":1820},[1048,5167,5168],{"class":1065},"        totp ",[1048,5170,1881],{"class":1078},[1048,5172,5173],{"class":1065}," pyotp",[1048,5175,1079],{"class":1078},[1048,5177,5178],{"class":1258},"TOTP",[1048,5180,1165],{"class":1078},[1048,5182,4883],{"class":1258},[1048,5184,1079],{"class":1078},[1048,5186,5079],{"class":1246},[1048,5188,1079],{"class":1078},[1048,5190,5191],{"class":1246},"secret_key",[1048,5193,1279],{"class":1078},[1048,5195,5196,5198,5201,5203,5206,5208,5211,5213,5216,5218,5221],{"class":1050,"line":1825},[1048,5197,1663],{"class":1061},[1048,5199,5200],{"class":1065}," totp",[1048,5202,1079],{"class":1078},[1048,5204,5205],{"class":1258},"verify",[1048,5207,1165],{"class":1078},[1048,5209,5210],{"class":1258},"token",[1048,5212,1216],{"class":1078},[1048,5214,5215],{"class":2467}," valid_window",[1048,5217,1881],{"class":1078},[1048,5219,5220],{"class":2284},"1",[1048,5222,1279],{"class":1078},[1048,5224,5225],{"class":1050,"line":1831},[1048,5226,1197],{"class":1065},[1048,5228,5229,5231,5234,5236,5238,5240,5243],{"class":1050,"line":1850},[1048,5230,1203],{"class":1157},[1048,5232,5233],{"class":1458}," get_user",[1048,5235,1165],{"class":1078},[1048,5237,1213],{"class":1212},[1048,5239,1216],{"class":1078},[1048,5241,5242],{"class":1223}," user_id",[1048,5244,1177],{"class":1078},[1048,5246,5247,5249,5252],{"class":1050,"line":1860},[1048,5248,1486],{"class":1183},[1048,5250,5251],{"class":1187},"Get user by ID",[1048,5253,1191],{"class":1183},[1048,5255,5256,5258],{"class":1050,"line":1865},[1048,5257,1526],{"class":1061},[1048,5259,1332],{"class":1078},[1048,5261,5262,5264,5266,5268,5270,5272,5274,5276,5279,5281,5284],{"class":1050,"line":1901},[1048,5263,1512],{"class":1061},[1048,5265,4783],{"class":1065},[1048,5267,1079],{"class":1078},[1048,5269,4788],{"class":1246},[1048,5271,1079],{"class":1078},[1048,5273,3463],{"class":1258},[1048,5275,1165],{"class":1078},[1048,5277,5278],{"class":2467},"pk",[1048,5280,1881],{"class":1078},[1048,5282,5283],{"class":1258},"user_id",[1048,5285,1279],{"class":1078},[1048,5287,5288,5290,5292,5294,5296],{"class":1050,"line":1916},[1048,5289,1568],{"class":1061},[1048,5291,4783],{"class":1065},[1048,5293,1079],{"class":1078},[1048,5295,4814],{"class":1246},[1048,5297,1332],{"class":1078},[1048,5299,5300,5302],{"class":1050,"line":1939},[1048,5301,1512],{"class":1061},[1048,5303,2599],{"class":1275},[1048,5305,5306],{"class":1050,"line":1944},[1048,5307,1151],{"emptyLinePlaceholder":1150},[1048,5309,5310],{"class":1050,"line":1967},[1048,5311,5312],{"class":1054},"# MFA Profile model\n",[1048,5314,5315,5317,5320,5322,5324,5326,5328],{"class":1050,"line":1977},[1048,5316,1158],{"class":1157},[1048,5318,5319],{"class":1161}," MFAProfile",[1048,5321,1165],{"class":1078},[1048,5323,1169],{"class":1168},[1048,5325,1079],{"class":1078},[1048,5327,2968],{"class":1168},[1048,5329,1177],{"class":1078},[1048,5331,5332,5334,5337],{"class":1050,"line":1997},[1048,5333,1184],{"class":1183},[1048,5335,5336],{"class":1187},"Multi-factor authentication profile",[1048,5338,1191],{"class":1183},[1048,5340,5341],{"class":1050,"line":2002},[1048,5342,1197],{"class":1065},[1048,5344,5345,5348,5350,5352,5354,5357,5359,5362,5364,5367,5369,5371,5373,5377,5379,5382,5384,5386,5388,5390],{"class":1050,"line":2026},[1048,5346,5347],{"class":1065},"    user ",[1048,5349,1881],{"class":1078},[1048,5351,2453],{"class":1065},[1048,5353,1079],{"class":1078},[1048,5355,5356],{"class":1258},"OneToOneField",[1048,5358,1165],{"class":1078},[1048,5360,5361],{"class":1258},"User",[1048,5363,1216],{"class":1078},[1048,5365,5366],{"class":2467}," on_delete",[1048,5368,1881],{"class":1078},[1048,5370,1169],{"class":1258},[1048,5372,1079],{"class":1078},[1048,5374,5376],{"class":5375},"sFGJz","CASCADE",[1048,5378,1216],{"class":1078},[1048,5380,5381],{"class":2467}," related_name",[1048,5383,1881],{"class":1078},[1048,5385,1265],{"class":1264},[1048,5387,5079],{"class":1268},[1048,5389,1265],{"class":1264},[1048,5391,1279],{"class":1078},[1048,5393,5394,5397,5399,5401,5403,5405,5407,5409,5411,5414,5416,5419,5421,5424],{"class":1050,"line":2034},[1048,5395,5396],{"class":1065},"    secret_key ",[1048,5398,1881],{"class":1078},[1048,5400,2453],{"class":1065},[1048,5402,1079],{"class":1078},[1048,5404,2458],{"class":1258},[1048,5406,1165],{"class":1078},[1048,5408,2989],{"class":2467},[1048,5410,1881],{"class":1078},[1048,5412,5413],{"class":2284},"32",[1048,5415,1216],{"class":1078},[1048,5417,5418],{"class":2467}," blank",[1048,5420,1881],{"class":1078},[1048,5422,5423],{"class":1275},"True",[1048,5425,1279],{"class":1078},[1048,5427,5428,5431,5433,5435,5437,5440,5442,5444,5446,5449],{"class":1050,"line":2043},[1048,5429,5430],{"class":1065},"    is_enabled ",[1048,5432,1881],{"class":1078},[1048,5434,2453],{"class":1065},[1048,5436,1079],{"class":1078},[1048,5438,5439],{"class":1258},"BooleanField",[1048,5441,1165],{"class":1078},[1048,5443,4273],{"class":2467},[1048,5445,1881],{"class":1078},[1048,5447,5448],{"class":1275},"False",[1048,5450,1279],{"class":1078},[1048,5452,5453,5456,5458,5460,5462,5464,5466,5468,5470,5473],{"class":1050,"line":2067},[1048,5454,5455],{"class":1065},"    backup_codes ",[1048,5457,1881],{"class":1078},[1048,5459,2453],{"class":1065},[1048,5461,1079],{"class":1078},[1048,5463,1845],{"class":1258},[1048,5465,1165],{"class":1078},[1048,5467,4273],{"class":2467},[1048,5469,1881],{"class":1078},[1048,5471,5472],{"class":1285},"list",[1048,5474,1279],{"class":1078},[1048,5476,5477,5480,5482,5484,5486,5489,5491,5494,5496,5498],{"class":1050,"line":2087},[1048,5478,5479],{"class":1065},"    created_at ",[1048,5481,1881],{"class":1078},[1048,5483,2453],{"class":1065},[1048,5485,1079],{"class":1078},[1048,5487,5488],{"class":1258},"DateTimeField",[1048,5490,1165],{"class":1078},[1048,5492,5493],{"class":2467},"auto_now_add",[1048,5495,1881],{"class":1078},[1048,5497,5423],{"class":1275},[1048,5499,1279],{"class":1078},[1048,5501,5502],{"class":1050,"line":2117},[1048,5503,1197],{"class":1065},[1048,5505,5506,5508,5511,5513,5515],{"class":1050,"line":2127},[1048,5507,1203],{"class":1157},[1048,5509,5510],{"class":1458}," generate_secret_key",[1048,5512,1165],{"class":1078},[1048,5514,1213],{"class":1212},[1048,5516,1177],{"class":1078},[1048,5518,5519,5521,5524],{"class":1050,"line":2133},[1048,5520,1486],{"class":1183},[1048,5522,5523],{"class":1187},"Generate new secret key",[1048,5525,1191],{"class":1183},[1048,5527,5528,5530,5532,5534,5536,5538,5540,5543],{"class":1050,"line":2139},[1048,5529,1241],{"class":1240},[1048,5531,1079],{"class":1078},[1048,5533,5191],{"class":1246},[1048,5535,1250],{"class":1078},[1048,5537,5173],{"class":1065},[1048,5539,1079],{"class":1078},[1048,5541,5542],{"class":1258},"random_base32",[1048,5544,1562],{"class":1078},[1048,5546,5547,5549,5551,5554],{"class":1050,"line":2144},[1048,5548,1241],{"class":1240},[1048,5550,1079],{"class":1078},[1048,5552,5553],{"class":1258},"save",[1048,5555,1562],{"class":1078},[1048,5557,5558],{"class":1050,"line":2150},[1048,5559,1197],{"class":1065},[1048,5561,5562,5564,5567,5569,5571],{"class":1050,"line":2163},[1048,5563,1203],{"class":1157},[1048,5565,5566],{"class":1458}," get_qr_code",[1048,5568,1165],{"class":1078},[1048,5570,1213],{"class":1212},[1048,5572,1177],{"class":1078},[1048,5574,5575,5577,5580],{"class":1050,"line":2168},[1048,5576,1486],{"class":1183},[1048,5578,5579],{"class":1187},"Generate QR code for MFA setup",[1048,5581,1191],{"class":1183},[1048,5583,5584,5586,5588,5590,5592,5594],{"class":1050,"line":2187},[1048,5585,1319],{"class":1061},[1048,5587,1322],{"class":1219},[1048,5589,1325],{"class":1240},[1048,5591,1079],{"class":1078},[1048,5593,5191],{"class":1246},[1048,5595,1332],{"class":1078},[1048,5597,5598,5600,5602,5605],{"class":1050,"line":2197},[1048,5599,1338],{"class":1240},[1048,5601,1079],{"class":1078},[1048,5603,5604],{"class":1258},"generate_secret_key",[1048,5606,1562],{"class":1078},[1048,5608,5609],{"class":1050,"line":2202},[1048,5610,1313],{"class":1065},[1048,5612,5613,5615,5617,5619,5621,5623,5625,5627,5629,5631],{"class":1050,"line":2236},[1048,5614,5168],{"class":1065},[1048,5616,1881],{"class":1078},[1048,5618,5173],{"class":1065},[1048,5620,1079],{"class":1078},[1048,5622,5178],{"class":1258},[1048,5624,1165],{"class":1078},[1048,5626,1213],{"class":1240},[1048,5628,1079],{"class":1078},[1048,5630,5191],{"class":1246},[1048,5632,1279],{"class":1078},[1048,5634,5635,5638,5640,5642,5644,5647],{"class":1050,"line":2262},[1048,5636,5637],{"class":1065},"        provisioning_uri ",[1048,5639,1881],{"class":1078},[1048,5641,5200],{"class":1065},[1048,5643,1079],{"class":1078},[1048,5645,5646],{"class":1258},"provisioning_uri",[1048,5648,2461],{"class":1078},[1048,5650,5651,5654,5656,5658,5660,5662,5664,5667],{"class":1050,"line":2290},[1048,5652,5653],{"class":2467},"            name",[1048,5655,1881],{"class":1078},[1048,5657,1213],{"class":1240},[1048,5659,1079],{"class":1078},[1048,5661,4883],{"class":1246},[1048,5663,1079],{"class":1078},[1048,5665,5666],{"class":1246},"email",[1048,5668,2476],{"class":1078},[1048,5670,5671,5674,5676,5678,5681],{"class":1050,"line":2315},[1048,5672,5673],{"class":2467},"            issuer_name",[1048,5675,1881],{"class":1078},[1048,5677,1402],{"class":1264},[1048,5679,5680],{"class":1268},"MyApp",[1048,5682,2785],{"class":1264},[1048,5684,5685],{"class":1050,"line":2338},[1048,5686,5687],{"class":1078},"        )\n",[1048,5689,5690],{"class":1050,"line":2343},[1048,5691,1313],{"class":1065},[1048,5693,5694,5697,5699,5702,5704,5707,5709,5712,5714,5716,5718,5721,5723,5726,5728,5731,5733,5736],{"class":1050,"line":2373},[1048,5695,5696],{"class":1065},"        qr ",[1048,5698,1881],{"class":1078},[1048,5700,5701],{"class":1065}," qrcode",[1048,5703,1079],{"class":1078},[1048,5705,5706],{"class":1258},"QRCode",[1048,5708,1165],{"class":1078},[1048,5710,5711],{"class":2467},"version",[1048,5713,1881],{"class":1078},[1048,5715,5220],{"class":2284},[1048,5717,1216],{"class":1078},[1048,5719,5720],{"class":2467}," box_size",[1048,5722,1881],{"class":1078},[1048,5724,5725],{"class":2284},"10",[1048,5727,1216],{"class":1078},[1048,5729,5730],{"class":2467}," border",[1048,5732,1881],{"class":1078},[1048,5734,5735],{"class":2284},"5",[1048,5737,1279],{"class":1078},[1048,5739,5740,5743,5745,5748,5750,5752],{"class":1050,"line":2383},[1048,5741,5742],{"class":1065},"        qr",[1048,5744,1079],{"class":1078},[1048,5746,5747],{"class":1258},"add_data",[1048,5749,1165],{"class":1078},[1048,5751,5646],{"class":1258},[1048,5753,1279],{"class":1078},[1048,5755,5756,5758,5760,5763,5765,5768,5770,5772],{"class":1050,"line":2410},[1048,5757,5742],{"class":1065},[1048,5759,1079],{"class":1078},[1048,5761,5762],{"class":1258},"make",[1048,5764,1165],{"class":1078},[1048,5766,5767],{"class":2467},"fit",[1048,5769,1881],{"class":1078},[1048,5771,5423],{"class":1275},[1048,5773,1279],{"class":1078},[1048,5775,5776],{"class":1050,"line":2415},[1048,5777,1313],{"class":1065},[1048,5779,5780,5783,5785,5788,5790,5793,5795,5798,5800,5802,5805,5807,5809,5812,5814,5816,5819,5821],{"class":1050,"line":2421},[1048,5781,5782],{"class":1065},"        img ",[1048,5784,1881],{"class":1078},[1048,5786,5787],{"class":1065}," qr",[1048,5789,1079],{"class":1078},[1048,5791,5792],{"class":1258},"make_image",[1048,5794,1165],{"class":1078},[1048,5796,5797],{"class":2467},"fill_color",[1048,5799,1881],{"class":1078},[1048,5801,1402],{"class":1264},[1048,5803,5804],{"class":1268},"black",[1048,5806,1402],{"class":1264},[1048,5808,1216],{"class":1078},[1048,5810,5811],{"class":2467}," back_color",[1048,5813,1881],{"class":1078},[1048,5815,1402],{"class":1264},[1048,5817,5818],{"class":1268},"white",[1048,5820,1402],{"class":1264},[1048,5822,1279],{"class":1078},[1048,5824,5825,5828,5830,5833],{"class":1050,"line":2445},[1048,5826,5827],{"class":1065},"        buffer ",[1048,5829,1881],{"class":1078},[1048,5831,5832],{"class":1258}," BytesIO",[1048,5834,1562],{"class":1078},[1048,5836,5837,5840,5842,5844,5846,5849,5851,5854,5856,5858,5861,5863],{"class":1050,"line":2464},[1048,5838,5839],{"class":1065},"        img",[1048,5841,1079],{"class":1078},[1048,5843,5553],{"class":1258},[1048,5845,1165],{"class":1078},[1048,5847,5848],{"class":1258},"buffer",[1048,5850,1216],{"class":1078},[1048,5852,5853],{"class":2467}," format",[1048,5855,1881],{"class":1078},[1048,5857,1265],{"class":1264},[1048,5859,5860],{"class":1268},"PNG",[1048,5862,1265],{"class":1264},[1048,5864,1279],{"class":1078},[1048,5866,5867],{"class":1050,"line":2479},[1048,5868,1313],{"class":1065},[1048,5870,5871,5873,5876,5878,5881,5883,5885,5887,5890,5892,5894],{"class":1050,"line":2496},[1048,5872,1663],{"class":1061},[1048,5874,5875],{"class":1065}," base64",[1048,5877,1079],{"class":1078},[1048,5879,5880],{"class":1258},"b64encode",[1048,5882,1165],{"class":1078},[1048,5884,5848],{"class":1258},[1048,5886,1079],{"class":1078},[1048,5888,5889],{"class":1258},"getvalue",[1048,5891,1556],{"class":1078},[1048,5893,1559],{"class":1258},[1048,5895,1562],{"class":1078},[1048,5897,5898],{"class":1050,"line":2511},[1048,5899,1197],{"class":1065},[1048,5901,5902,5904,5907,5909,5911],{"class":1050,"line":2517},[1048,5903,1203],{"class":1157},[1048,5905,5906],{"class":1458}," generate_backup_codes",[1048,5908,1165],{"class":1078},[1048,5910,1213],{"class":1212},[1048,5912,1177],{"class":1078},[1048,5914,5915,5917,5920],{"class":1050,"line":2541},[1048,5916,1486],{"class":1183},[1048,5918,5919],{"class":1187},"Generate backup codes",[1048,5921,1191],{"class":1183},[1048,5923,5924,5926],{"class":1050,"line":2546},[1048,5925,3679],{"class":1061},[1048,5927,5928],{"class":1065}," secrets\n",[1048,5930,5931,5934,5936,5938,5941,5943,5946,5948,5951,5953,5956,5958,5961,5964,5966,5969,5971,5973],{"class":1050,"line":2571},[1048,5932,5933],{"class":1065},"        codes ",[1048,5935,1881],{"class":1078},[1048,5937,3809],{"class":1078},[1048,5939,5940],{"class":1065},"secrets",[1048,5942,1079],{"class":1078},[1048,5944,5945],{"class":1258},"token_hex",[1048,5947,1165],{"class":1078},[1048,5949,5950],{"class":2284},"4",[1048,5952,1764],{"class":1078},[1048,5954,5955],{"class":1258},"upper",[1048,5957,3009],{"class":1078},[1048,5959,5960],{"class":1061}," for",[1048,5962,5963],{"class":1065}," _ ",[1048,5965,3773],{"class":1061},[1048,5967,5968],{"class":1206}," range",[1048,5970,1165],{"class":1078},[1048,5972,5725],{"class":2284},[1048,5974,5975],{"class":1078},")]\n",[1048,5977,5978,5980,5982,5985,5987],{"class":1050,"line":2581},[1048,5979,1241],{"class":1240},[1048,5981,1079],{"class":1078},[1048,5983,5984],{"class":1246},"backup_codes",[1048,5986,1250],{"class":1078},[1048,5988,5989],{"class":1065}," codes\n",[1048,5991,5992,5994,5996,5998],{"class":1050,"line":2594},[1048,5993,1241],{"class":1240},[1048,5995,1079],{"class":1078},[1048,5997,5553],{"class":1258},[1048,5999,1562],{"class":1078},[1048,6001,6002,6004],{"class":1050,"line":2602},[1048,6003,1663],{"class":1061},[1048,6005,5989],{"class":1065},[1048,6007,6008],{"class":1050,"line":2637},[1048,6009,1151],{"emptyLinePlaceholder":1150},[1048,6011,6012],{"class":1050,"line":2642},[1048,6013,6014],{"class":1054},"# LDAP authentication backend\n",[1048,6016,6017,6019],{"class":1050,"line":2651},[1048,6018,1062],{"class":1061},[1048,6020,6021],{"class":1065}," ldap\n",[1048,6023,6024,6026,6029,6031,6034,6036],{"class":1050,"line":2661},[1048,6025,1072],{"class":1061},[1048,6027,6028],{"class":1065}," django_auth_ldap",[1048,6030,1079],{"class":1078},[1048,6032,6033],{"class":1065},"backend ",[1048,6035,1062],{"class":1061},[1048,6037,6038],{"class":1065}," LDAPBackend\n",[1048,6040,6041],{"class":1050,"line":2666},[1048,6042,1151],{"emptyLinePlaceholder":1150},[1048,6044,6045,6047,6050,6052,6055],{"class":1050,"line":2696},[1048,6046,1158],{"class":1157},[1048,6048,6049],{"class":1161}," CustomLDAPBackend",[1048,6051,1165],{"class":1078},[1048,6053,6054],{"class":1168},"LDAPBackend",[1048,6056,1177],{"class":1078},[1048,6058,6059,6061,6064],{"class":1050,"line":2721},[1048,6060,1184],{"class":1183},[1048,6062,6063],{"class":1187},"Custom LDAP backend with additional features",[1048,6065,1191],{"class":1183},[1048,6067,6068],{"class":1050,"line":2735},[1048,6069,1197],{"class":1065},[1048,6071,6072,6074,6077,6079,6081,6083,6086,6088,6090],{"class":1050,"line":2740},[1048,6073,1203],{"class":1157},[1048,6075,6076],{"class":1458}," authenticate_ldap_user",[1048,6078,1165],{"class":1078},[1048,6080,1213],{"class":1212},[1048,6082,1216],{"class":1078},[1048,6084,6085],{"class":1223}," ldap_user",[1048,6087,1216],{"class":1078},[1048,6089,4737],{"class":1223},[1048,6091,1177],{"class":1078},[1048,6093,6094,6096,6099],{"class":1050,"line":2754},[1048,6095,1486],{"class":1183},[1048,6097,6098],{"class":1187},"Authenticate LDAP user with custom logic",[1048,6100,1191],{"class":1183},[1048,6102,6103,6106,6108,6110,6112,6115,6117,6120,6122,6124],{"class":1050,"line":2788},[1048,6104,6105],{"class":1065},"        user ",[1048,6107,1881],{"class":1078},[1048,6109,3626],{"class":1285},[1048,6111,1289],{"class":1078},[1048,6113,6114],{"class":1258},"authenticate_ldap_user",[1048,6116,1165],{"class":1078},[1048,6118,6119],{"class":1258},"ldap_user",[1048,6121,1216],{"class":1078},[1048,6123,4737],{"class":1258},[1048,6125,1279],{"class":1078},[1048,6127,6128],{"class":1050,"line":2793},[1048,6129,1313],{"class":1065},[1048,6131,6132,6134,6136],{"class":1050,"line":2812},[1048,6133,1319],{"class":1061},[1048,6135,4840],{"class":1065},[1048,6137,1332],{"class":1078},[1048,6139,6140],{"class":1050,"line":2830},[1048,6141,6142],{"class":1054},"            # Sync additional LDAP attributes\n",[1048,6144,6145,6147,6149,6152,6154,6156,6158,6160],{"class":1050,"line":2853},[1048,6146,1338],{"class":1240},[1048,6148,1079],{"class":1078},[1048,6150,6151],{"class":1258},"sync_user_attributes",[1048,6153,1165],{"class":1078},[1048,6155,4883],{"class":1258},[1048,6157,1216],{"class":1078},[1048,6159,6085],{"class":1258},[1048,6161,1279],{"class":1078},[1048,6163,6164],{"class":1050,"line":2871},[1048,6165,4953],{"class":1065},[1048,6167,6168],{"class":1050,"line":2905},[1048,6169,6170],{"class":1054},"            # Check group membership\n",[1048,6172,6173,6175,6177,6179,6181,6184,6186,6188],{"class":1050,"line":2943},[1048,6174,2833],{"class":1061},[1048,6176,1322],{"class":1219},[1048,6178,1325],{"class":1240},[1048,6180,1079],{"class":1078},[1048,6182,6183],{"class":1258},"check_group_membership",[1048,6185,1165],{"class":1078},[1048,6187,6119],{"class":1258},[1048,6189,1177],{"class":1078},[1048,6191,6192,6194],{"class":1050,"line":2948},[1048,6193,3596],{"class":1061},[1048,6195,2599],{"class":1275},[1048,6197,6198],{"class":1050,"line":2954},[1048,6199,1313],{"class":1065},[1048,6201,6202,6204],{"class":1050,"line":2973},[1048,6203,1663],{"class":1061},[1048,6205,5032],{"class":1065},[1048,6207,6208],{"class":1050,"line":2999},[1048,6209,1197],{"class":1065},[1048,6211,6212,6214,6217,6219,6221,6223,6225,6227,6229],{"class":1050,"line":3015},[1048,6213,1203],{"class":1157},[1048,6215,6216],{"class":1458}," sync_user_attributes",[1048,6218,1165],{"class":1078},[1048,6220,1213],{"class":1212},[1048,6222,1216],{"class":1078},[1048,6224,4840],{"class":1223},[1048,6226,1216],{"class":1078},[1048,6228,6085],{"class":1223},[1048,6230,1177],{"class":1078},[1048,6232,6233,6235,6238],{"class":1050,"line":3027},[1048,6234,1486],{"class":1183},[1048,6236,6237],{"class":1187},"Sync additional attributes from LDAP",[1048,6239,1191],{"class":1183},[1048,6241,6242,6245,6247,6249,6251],{"class":1050,"line":3044},[1048,6243,6244],{"class":1065},"        ldap_attrs ",[1048,6246,1881],{"class":1078},[1048,6248,6085],{"class":1065},[1048,6250,1079],{"class":1078},[1048,6252,6253],{"class":1246},"attrs\n",[1048,6255,6256],{"class":1050,"line":3067},[1048,6257,1313],{"class":1065},[1048,6259,6260],{"class":1050,"line":3082},[1048,6261,6262],{"class":1054},"        # Sync department\n",[1048,6264,6265,6267,6269,6272,6274,6276,6279],{"class":1050,"line":3115},[1048,6266,1319],{"class":1061},[1048,6268,1357],{"class":1264},[1048,6270,6271],{"class":1268},"department",[1048,6273,1265],{"class":1264},[1048,6275,3727],{"class":1219},[1048,6277,6278],{"class":1065}," ldap_attrs",[1048,6280,1332],{"class":1078},[1048,6282,6283,6286,6288,6291,6293,6295,6297,6299,6301,6303,6305,6307,6310,6313],{"class":1050,"line":3129},[1048,6284,6285],{"class":1065},"            user",[1048,6287,1079],{"class":1078},[1048,6289,6290],{"class":1246},"profile",[1048,6292,1079],{"class":1078},[1048,6294,6271],{"class":1246},[1048,6296,1250],{"class":1078},[1048,6298,6278],{"class":1065},[1048,6300,4196],{"class":1078},[1048,6302,1265],{"class":1264},[1048,6304,6271],{"class":1268},[1048,6306,1265],{"class":1264},[1048,6308,6309],{"class":1078},"][",[1048,6311,6312],{"class":2284},"0",[1048,6314,4202],{"class":1078},[1048,6316,6317],{"class":1050,"line":3149},[1048,6318,1313],{"class":1065},[1048,6320,6321],{"class":1050,"line":3162},[1048,6322,6323],{"class":1054},"        # Sync manager\n",[1048,6325,6326,6328,6330,6333,6335,6337,6339],{"class":1050,"line":3193},[1048,6327,1319],{"class":1061},[1048,6329,1357],{"class":1264},[1048,6331,6332],{"class":1268},"manager",[1048,6334,1265],{"class":1264},[1048,6336,3727],{"class":1219},[1048,6338,6278],{"class":1065},[1048,6340,1332],{"class":1078},[1048,6342,6343,6346,6348,6350,6352,6354,6356,6358,6360,6362],{"class":1050,"line":3223},[1048,6344,6345],{"class":1065},"            manager_dn ",[1048,6347,1881],{"class":1078},[1048,6349,6278],{"class":1065},[1048,6351,4196],{"class":1078},[1048,6353,1265],{"class":1264},[1048,6355,6332],{"class":1268},[1048,6357,1265],{"class":1264},[1048,6359,6309],{"class":1078},[1048,6361,6312],{"class":2284},[1048,6363,4202],{"class":1078},[1048,6365,6366],{"class":1050,"line":3254},[1048,6367,6368],{"class":1054},"            # Look up manager user\n",[1048,6370,6371,6373],{"class":1050,"line":3260},[1048,6372,2029],{"class":1061},[1048,6374,1332],{"class":1078},[1048,6376,6377,6380,6382,6384,6386,6388,6390,6392,6394,6396,6398,6400,6402,6405,6407,6410],{"class":1050,"line":3266},[1048,6378,6379],{"class":1065},"                manager ",[1048,6381,1881],{"class":1078},[1048,6383,4783],{"class":1065},[1048,6385,1079],{"class":1078},[1048,6387,4788],{"class":1246},[1048,6389,1079],{"class":1078},[1048,6391,3463],{"class":1258},[1048,6393,1165],{"class":1078},[1048,6395,4797],{"class":2467},[1048,6397,1881],{"class":1078},[1048,6399,1213],{"class":1240},[1048,6401,1079],{"class":1078},[1048,6403,6404],{"class":1258},"extract_username_from_dn",[1048,6406,1165],{"class":1078},[1048,6408,6409],{"class":1258},"manager_dn",[1048,6411,2718],{"class":1078},[1048,6413,6414,6417,6419,6421,6423,6425,6427],{"class":1050,"line":3272},[1048,6415,6416],{"class":1065},"                user",[1048,6418,1079],{"class":1078},[1048,6420,6290],{"class":1246},[1048,6422,1079],{"class":1078},[1048,6424,6332],{"class":1246},[1048,6426,1250],{"class":1078},[1048,6428,6429],{"class":1065}," manager\n",[1048,6431,6433,6435,6437,6439,6441],{"class":1050,"line":6432},139,[1048,6434,2070],{"class":1061},[1048,6436,4783],{"class":1065},[1048,6438,1079],{"class":1078},[1048,6440,4814],{"class":1246},[1048,6442,1332],{"class":1078},[1048,6444,6446],{"class":1050,"line":6445},140,[1048,6447,2136],{"class":1061},[1048,6449,6451],{"class":1050,"line":6450},141,[1048,6452,1313],{"class":1065},[1048,6454,6456,6459,6461,6463,6465,6467],{"class":1050,"line":6455},142,[1048,6457,6458],{"class":1065},"        user",[1048,6460,1079],{"class":1078},[1048,6462,6290],{"class":1246},[1048,6464,1079],{"class":1078},[1048,6466,5553],{"class":1258},[1048,6468,1562],{"class":1078},[1048,6470,6472],{"class":1050,"line":6471},143,[1048,6473,1197],{"class":1065},[1048,6475,6477,6479,6482,6484,6486,6488,6490],{"class":1050,"line":6476},144,[1048,6478,1203],{"class":1157},[1048,6480,6481],{"class":1458}," check_group_membership",[1048,6483,1165],{"class":1078},[1048,6485,1213],{"class":1212},[1048,6487,1216],{"class":1078},[1048,6489,6085],{"class":1223},[1048,6491,1177],{"class":1078},[1048,6493,6495,6497,6500],{"class":1050,"line":6494},145,[1048,6496,1486],{"class":1183},[1048,6498,6499],{"class":1187},"Check if user is member of required groups",[1048,6501,1191],{"class":1183},[1048,6503,6505,6508,6510,6512,6514,6516,6518,6520,6523,6525,6527],{"class":1050,"line":6504},146,[1048,6506,6507],{"class":1065},"        required_groups ",[1048,6509,1881],{"class":1078},[1048,6511,1347],{"class":1206},[1048,6513,1165],{"class":1078},[1048,6515,1352],{"class":1258},[1048,6517,1216],{"class":1078},[1048,6519,1357],{"class":1264},[1048,6521,6522],{"class":1268},"LDAP_REQUIRED_GROUPS",[1048,6524,1265],{"class":1264},[1048,6526,1216],{"class":1078},[1048,6528,3477],{"class":1078},[1048,6530,6532],{"class":1050,"line":6531},147,[1048,6533,1313],{"class":1065},[1048,6535,6537,6539,6541,6544],{"class":1050,"line":6536},148,[1048,6538,1319],{"class":1061},[1048,6540,1322],{"class":1219},[1048,6542,6543],{"class":1065}," required_groups",[1048,6545,1332],{"class":1078},[1048,6547,6549,6551],{"class":1050,"line":6548},149,[1048,6550,1512],{"class":1061},[1048,6552,3758],{"class":1275},[1048,6554,6556],{"class":1050,"line":6555},150,[1048,6557,1313],{"class":1065},[1048,6559,6561,6564,6566,6568,6570],{"class":1050,"line":6560},151,[1048,6562,6563],{"class":1065},"        user_groups ",[1048,6565,1881],{"class":1078},[1048,6567,6085],{"class":1065},[1048,6569,1079],{"class":1078},[1048,6571,6572],{"class":1246},"group_names\n",[1048,6574,6576,6578,6580,6582,6585,6587,6590,6593,6596,6598,6600],{"class":1050,"line":6575},152,[1048,6577,1663],{"class":1061},[1048,6579,3765],{"class":1206},[1048,6581,1165],{"class":1078},[1048,6583,6584],{"class":1258},"group ",[1048,6586,3773],{"class":1061},[1048,6588,6589],{"class":1258}," user_groups ",[1048,6591,6592],{"class":1061},"for",[1048,6594,6595],{"class":1258}," group ",[1048,6597,3773],{"class":1061},[1048,6599,6543],{"class":1258},[1048,6601,1279],{"class":1078},[1030,6603,6605],{"id":6604},"custom-admin-interface-components","Custom Admin Interface Components",[1026,6607,6608],{},"Extend Django's admin interface with custom functionality and improved user experience.",[1038,6610,6612],{"className":1040,"code":6611,"language":1042,"meta":1043,"style":1043},"# Custom admin actions\nfrom django.contrib import admin\nfrom django.http import HttpResponse\nfrom django.shortcuts import render\nimport csv\n\nclass ExportMixin:\n    \"\"\"Mixin for exporting model data\"\"\"\n    \n    def export_as_csv(self, request, queryset):\n        \"\"\"Export selected objects as CSV\"\"\"\n        meta = self.model._meta\n        field_names = [field.name for field in meta.fields]\n        \n        response = HttpResponse(content_type='text/csv')\n        response['Content-Disposition'] = f'attachment; filename={meta}.csv'\n        \n        writer = csv.writer(response)\n        writer.writerow(field_names)\n        \n        for obj in queryset:\n            writer.writerow([getattr(obj, field) for field in field_names])\n        \n        return response\n    \n    export_as_csv.short_description = \"Export selected as CSV\"\n\nclass BulkUpdateMixin:\n    \"\"\"Mixin for bulk updating objects\"\"\"\n    \n    def bulk_update_form(self, request, queryset):\n        \"\"\"Show form for bulk updating\"\"\"\n        if request.method == 'POST':\n            # Process bulk update\n            update_fields = {}\n            for key, value in request.POST.items():\n                if key.startswith('bulk_') and value:\n                    field_name = key[5:]  # Remove 'bulk_' prefix\n                    update_fields[field_name] = value\n            \n            if update_fields:\n                queryset.update(**update_fields)\n                self.message_user(request, f\"Updated {queryset.count()} objects\")\n            \n            return None\n        \n        # Show form\n        context = {\n            'queryset': queryset,\n            'model_fields': [f for f in self.model._meta.fields if f.editable],\n        }\n        return render(request, 'admin/bulk_update_form.html', context)\n    \n    bulk_update_form.short_description = \"Bulk update selected\"\n\n# Custom admin widgets\nfrom django import forms\nfrom django.contrib.admin.widgets import AdminFileWidget\n\nclass ImagePreviewWidget(AdminFileWidget):\n    \"\"\"Widget that shows image preview\"\"\"\n    \n    def render(self, name, value, attrs=None, renderer=None):\n        output = super().render(name, value, attrs, renderer)\n        \n        if value and hasattr(value, 'url'):\n            output += f'''\n            \u003Cdiv style=\"margin-top: 10px;\">\n                \u003Cimg src=\"{value.url}\" style=\"max-width: 200px; max-height: 200px;\" />\n            \u003C/div>\n            '''\n        \n        return output\n\nclass ColorPickerWidget(forms.TextInput):\n    \"\"\"Color picker widget\"\"\"\n    \n    def __init__(self, attrs=None):\n        default_attrs = {'type': 'color'}\n        if attrs:\n            default_attrs.update(attrs)\n        super().__init__(default_attrs)\n\n# Advanced admin class\n@admin.register(Product)\nclass ProductAdmin(admin.ModelAdmin, ExportMixin, BulkUpdateMixin):\n    \"\"\"Advanced product admin\"\"\"\n    \n    list_display = ['name', 'price', 'category', 'is_active', 'created_at']\n    list_filter = ['category', 'is_active', 'created_at']\n    search_fields = ['name', 'description']\n    list_editable = ['price', 'is_active']\n    \n    actions = ['export_as_csv', 'bulk_update_form', 'make_active', 'make_inactive']\n    \n    fieldsets = (\n        ('Basic Information', {\n            'fields': ('name', 'description', 'category')\n        }),\n        ('Pricing', {\n            'fields': ('price', 'currency'),\n            'classes': ('collapse',)\n        }),\n        ('Status', {\n            'fields': ('is_active', 'featured'),\n        }),\n        ('Metadata', {\n            'fields': ('created_at', 'updated_at'),\n            'classes': ('collapse',),\n        }),\n    )\n    \n    readonly_fields = ['created_at', 'updated_at']\n    \n    def make_active(self, request, queryset):\n        \"\"\"Make selected products active\"\"\"\n        updated = queryset.update(is_active=True)\n        self.message_user(request, f\"Made {updated} products active\")\n    \n    def make_inactive(self, request, queryset):\n        \"\"\"Make selected products inactive\"\"\"\n        updated = queryset.update(is_active=False)\n        self.message_user(request, f\"Made {updated} products inactive\")\n    \n    def get_queryset(self, request):\n        \"\"\"Optimize queryset\"\"\"\n        return super().get_queryset(request).select_related('category')\n    \n    def formfield_for_dbfield(self, db_field, request, **kwargs):\n        \"\"\"Customize form fields\"\"\"\n        if db_field.name == 'image':\n            kwargs['widget'] = ImagePreviewWidget\n        elif db_field.name == 'color':\n            kwargs['widget'] = ColorPickerWidget\n        \n        return super().formfield_for_dbfield(db_field, request, **kwargs)\n\n# Custom admin site\nclass CustomAdminSite(admin.AdminSite):\n    \"\"\"Custom admin site with additional features\"\"\"\n    \n    site_header = \"MyApp Administration\"\n    site_title = \"MyApp Admin\"\n    index_title = \"Welcome to MyApp Administration\"\n    \n    def index(self, request, extra_context=None):\n        \"\"\"Custom admin index with dashboard\"\"\"\n        extra_context = extra_context or {}\n        \n        # Add dashboard data\n        extra_context.update({\n            'total_users': User.objects.count(),\n            'total_products': Product.objects.count(),\n            'recent_orders': Order.objects.order_by('-created_at')[:5],\n        })\n        \n        return super().index(request, extra_context)\n\n# Register custom admin site\ncustom_admin_site = CustomAdminSite(name='custom_admin')\ncustom_admin_site.register(User, UserAdmin)\ncustom_admin_site.register(Product, ProductAdmin)\n",[1045,6613,6614,6619,6635,6651,6667,6674,6678,6687,6696,6700,6722,6731,6750,6783,6787,6813,6847,6851,6873,6890,6894,6908,6947,6951,6958,6962,6982,6986,6995,7004,7008,7029,7038,7061,7066,7076,7103,7132,7151,7167,7171,7180,7199,7240,7244,7250,7254,7259,7268,7282,7333,7337,7364,7368,7386,7390,7395,7407,7432,7436,7450,7459,7463,7501,7533,7537,7563,7576,7581,7599,7604,7609,7613,7620,7624,7643,7652,7656,7676,7702,7710,7726,7741,7745,7750,7769,7795,7804,7808,7861,7894,7920,7945,7949,7994,7998,8008,8024,8061,8066,8081,8110,8133,8137,8152,8181,8185,8200,8229,8250,8254,8259,8263,8288,8292,8313,8322,8345,8376,8380,8401,8410,8432,8461,8465,8482,8491,8521,8525,8553,8562,8583,8604,8625,8644,8648,8676,8680,8685,8703,8712,8716,8730,8744,8758,8762,8788,8797,8811,8815,8820,8832,8856,8880,8920,8926,8931,8953,8958,8964,8989,9010],{"__ignoreMap":1043},[1048,6615,6616],{"class":1050,"line":1051},[1048,6617,6618],{"class":1054},"# Custom admin actions\n",[1048,6620,6621,6623,6625,6627,6630,6632],{"class":1050,"line":1058},[1048,6622,1072],{"class":1061},[1048,6624,1095],{"class":1065},[1048,6626,1079],{"class":1078},[1048,6628,6629],{"class":1065},"contrib ",[1048,6631,1062],{"class":1061},[1048,6633,6634],{"class":1065}," admin\n",[1048,6636,6637,6639,6641,6643,6646,6648],{"class":1050,"line":1069},[1048,6638,1072],{"class":1061},[1048,6640,1095],{"class":1065},[1048,6642,1079],{"class":1078},[1048,6644,6645],{"class":1065},"http ",[1048,6647,1062],{"class":1061},[1048,6649,6650],{"class":1065}," HttpResponse\n",[1048,6652,6653,6655,6657,6659,6662,6664],{"class":1050,"line":1090},[1048,6654,1072],{"class":1061},[1048,6656,1095],{"class":1065},[1048,6658,1079],{"class":1078},[1048,6660,6661],{"class":1065},"shortcuts ",[1048,6663,1062],{"class":1061},[1048,6665,6666],{"class":1065}," render\n",[1048,6668,6669,6671],{"class":1050,"line":1108},[1048,6670,1062],{"class":1061},[1048,6672,6673],{"class":1065}," csv\n",[1048,6675,6676],{"class":1050,"line":1130},[1048,6677,1151],{"emptyLinePlaceholder":1150},[1048,6679,6680,6682,6685],{"class":1050,"line":1147},[1048,6681,1158],{"class":1157},[1048,6683,6684],{"class":1161}," ExportMixin",[1048,6686,1332],{"class":1078},[1048,6688,6689,6691,6694],{"class":1050,"line":1154},[1048,6690,1184],{"class":1183},[1048,6692,6693],{"class":1187},"Mixin for exporting model data",[1048,6695,1191],{"class":1183},[1048,6697,6698],{"class":1050,"line":1180},[1048,6699,1197],{"class":1065},[1048,6701,6702,6704,6707,6709,6711,6713,6715,6717,6720],{"class":1050,"line":1194},[1048,6703,1203],{"class":1157},[1048,6705,6706],{"class":1458}," export_as_csv",[1048,6708,1165],{"class":1078},[1048,6710,1213],{"class":1212},[1048,6712,1216],{"class":1078},[1048,6714,4723],{"class":1223},[1048,6716,1216],{"class":1078},[1048,6718,6719],{"class":1223}," queryset",[1048,6721,1177],{"class":1078},[1048,6723,6724,6726,6729],{"class":1050,"line":1200},[1048,6725,1486],{"class":1183},[1048,6727,6728],{"class":1187},"Export selected objects as CSV",[1048,6730,1191],{"class":1183},[1048,6732,6733,6736,6738,6740,6742,6745,6747],{"class":1050,"line":1237},[1048,6734,6735],{"class":1065},"        meta ",[1048,6737,1881],{"class":1078},[1048,6739,1325],{"class":1240},[1048,6741,1079],{"class":1078},[1048,6743,6744],{"class":1246},"model",[1048,6746,1079],{"class":1078},[1048,6748,6749],{"class":1246},"_meta\n",[1048,6751,6752,6755,6757,6759,6762,6764,6766,6768,6771,6773,6776,6778,6781],{"class":1050,"line":1282},[1048,6753,6754],{"class":1065},"        field_names ",[1048,6756,1881],{"class":1078},[1048,6758,3809],{"class":1078},[1048,6760,6761],{"class":1065},"field",[1048,6763,1079],{"class":1078},[1048,6765,3636],{"class":1246},[1048,6767,5960],{"class":1061},[1048,6769,6770],{"class":1065}," field ",[1048,6772,3773],{"class":1061},[1048,6774,6775],{"class":1065}," meta",[1048,6777,1079],{"class":1078},[1048,6779,6780],{"class":1246},"fields",[1048,6782,4202],{"class":1078},[1048,6784,6785],{"class":1050,"line":1310},[1048,6786,1313],{"class":1065},[1048,6788,6789,6792,6794,6797,6799,6802,6804,6806,6809,6811],{"class":1050,"line":1316},[1048,6790,6791],{"class":1065},"        response ",[1048,6793,1881],{"class":1078},[1048,6795,6796],{"class":1258}," HttpResponse",[1048,6798,1165],{"class":1078},[1048,6800,6801],{"class":2467},"content_type",[1048,6803,1881],{"class":1078},[1048,6805,1265],{"class":1264},[1048,6807,6808],{"class":1268},"text/csv",[1048,6810,1265],{"class":1264},[1048,6812,1279],{"class":1078},[1048,6814,6815,6818,6820,6822,6825,6827,6830,6832,6834,6837,6839,6842,6844],{"class":1050,"line":1335},[1048,6816,6817],{"class":1065},"        response",[1048,6819,4196],{"class":1078},[1048,6821,1265],{"class":1264},[1048,6823,6824],{"class":1268},"Content-Disposition",[1048,6826,1265],{"class":1264},[1048,6828,6829],{"class":1078},"]",[1048,6831,1250],{"class":1078},[1048,6833,2759],{"class":1157},[1048,6835,6836],{"class":1268},"'attachment; filename=",[1048,6838,1807],{"class":1806},[1048,6840,6841],{"class":1065},"meta",[1048,6843,1813],{"class":1806},[1048,6845,6846],{"class":1268},".csv'\n",[1048,6848,6849],{"class":1050,"line":1371},[1048,6850,1313],{"class":1065},[1048,6852,6853,6856,6858,6861,6863,6866,6868,6871],{"class":1050,"line":1376},[1048,6854,6855],{"class":1065},"        writer ",[1048,6857,1881],{"class":1078},[1048,6859,6860],{"class":1065}," csv",[1048,6862,1079],{"class":1078},[1048,6864,6865],{"class":1258},"writer",[1048,6867,1165],{"class":1078},[1048,6869,6870],{"class":1258},"response",[1048,6872,1279],{"class":1078},[1048,6874,6875,6878,6880,6883,6885,6888],{"class":1050,"line":1391},[1048,6876,6877],{"class":1065},"        writer",[1048,6879,1079],{"class":1078},[1048,6881,6882],{"class":1258},"writerow",[1048,6884,1165],{"class":1078},[1048,6886,6887],{"class":1258},"field_names",[1048,6889,1279],{"class":1078},[1048,6891,6892],{"class":1050,"line":1412},[1048,6893,1313],{"class":1065},[1048,6895,6896,6899,6902,6904,6906],{"class":1050,"line":1417},[1048,6897,6898],{"class":1061},"        for",[1048,6900,6901],{"class":1065}," obj ",[1048,6903,3773],{"class":1061},[1048,6905,6719],{"class":1065},[1048,6907,1332],{"class":1078},[1048,6909,6910,6913,6915,6917,6920,6923,6925,6928,6930,6933,6935,6937,6939,6941,6944],{"class":1050,"line":1448},[1048,6911,6912],{"class":1065},"            writer",[1048,6914,1079],{"class":1078},[1048,6916,6882],{"class":1258},[1048,6918,6919],{"class":1078},"([",[1048,6921,6922],{"class":1206},"getattr",[1048,6924,1165],{"class":1078},[1048,6926,6927],{"class":1258},"obj",[1048,6929,1216],{"class":1078},[1048,6931,6932],{"class":1258}," field",[1048,6934,1639],{"class":1078},[1048,6936,5960],{"class":1061},[1048,6938,6770],{"class":1258},[1048,6940,3773],{"class":1061},[1048,6942,6943],{"class":1258}," field_names",[1048,6945,6946],{"class":1078},"])\n",[1048,6948,6949],{"class":1050,"line":1453},[1048,6950,1313],{"class":1065},[1048,6952,6953,6955],{"class":1050,"line":1483},[1048,6954,1663],{"class":1061},[1048,6956,6957],{"class":1065}," response\n",[1048,6959,6960],{"class":1050,"line":1494},[1048,6961,1197],{"class":1065},[1048,6963,6964,6967,6969,6972,6974,6977,6980],{"class":1050,"line":1509},[1048,6965,6966],{"class":1065},"    export_as_csv",[1048,6968,1079],{"class":1078},[1048,6970,6971],{"class":1246},"short_description",[1048,6973,1250],{"class":1078},[1048,6975,6976],{"class":1264}," \"",[1048,6978,6979],{"class":1268},"Export selected as CSV",[1048,6981,2785],{"class":1264},[1048,6983,6984],{"class":1050,"line":1518},[1048,6985,1151],{"emptyLinePlaceholder":1150},[1048,6987,6988,6990,6993],{"class":1050,"line":1523},[1048,6989,1158],{"class":1157},[1048,6991,6992],{"class":1161}," BulkUpdateMixin",[1048,6994,1332],{"class":1078},[1048,6996,6997,6999,7002],{"class":1050,"line":1531},[1048,6998,1184],{"class":1183},[1048,7000,7001],{"class":1187},"Mixin for bulk updating objects",[1048,7003,1191],{"class":1183},[1048,7005,7006],{"class":1050,"line":1565},[1048,7007,1197],{"class":1065},[1048,7009,7010,7012,7015,7017,7019,7021,7023,7025,7027],{"class":1050,"line":1576},[1048,7011,1203],{"class":1157},[1048,7013,7014],{"class":1458}," bulk_update_form",[1048,7016,1165],{"class":1078},[1048,7018,1213],{"class":1212},[1048,7020,1216],{"class":1078},[1048,7022,4723],{"class":1223},[1048,7024,1216],{"class":1078},[1048,7026,6719],{"class":1223},[1048,7028,1177],{"class":1078},[1048,7030,7031,7033,7036],{"class":1050,"line":1582},[1048,7032,1486],{"class":1183},[1048,7034,7035],{"class":1187},"Show form for bulk updating",[1048,7037,1191],{"class":1183},[1048,7039,7040,7042,7044,7046,7049,7052,7054,7057,7059],{"class":1050,"line":1589},[1048,7041,1319],{"class":1061},[1048,7043,4723],{"class":1065},[1048,7045,1079],{"class":1078},[1048,7047,7048],{"class":1246},"method",[1048,7050,7051],{"class":1219}," ==",[1048,7053,1357],{"class":1264},[1048,7055,7056],{"class":1268},"POST",[1048,7058,1265],{"class":1264},[1048,7060,1332],{"class":1078},[1048,7062,7063],{"class":1050,"line":1594},[1048,7064,7065],{"class":1054},"            # Process bulk update\n",[1048,7067,7068,7071,7073],{"class":1050,"line":1612},[1048,7069,7070],{"class":1065},"            update_fields ",[1048,7072,1881],{"class":1078},[1048,7074,7075],{"class":1078}," {}\n",[1048,7077,7078,7081,7084,7086,7088,7090,7092,7094,7096,7098,7101],{"class":1050,"line":1622},[1048,7079,7080],{"class":1061},"            for",[1048,7082,7083],{"class":1065}," key",[1048,7085,1216],{"class":1078},[1048,7087,1499],{"class":1065},[1048,7089,3773],{"class":1061},[1048,7091,4723],{"class":1065},[1048,7093,1079],{"class":1078},[1048,7095,7056],{"class":5375},[1048,7097,1079],{"class":1078},[1048,7099,7100],{"class":1258},"items",[1048,7102,3544],{"class":1078},[1048,7104,7105,7108,7110,7112,7115,7117,7119,7122,7124,7126,7128,7130],{"class":1050,"line":1653},[1048,7106,7107],{"class":1061},"                if",[1048,7109,7083],{"class":1065},[1048,7111,1079],{"class":1078},[1048,7113,7114],{"class":1258},"startswith",[1048,7116,1165],{"class":1078},[1048,7118,1265],{"class":1264},[1048,7120,7121],{"class":1268},"bulk_",[1048,7123,1265],{"class":1264},[1048,7125,1639],{"class":1078},[1048,7127,2013],{"class":1219},[1048,7129,1468],{"class":1065},[1048,7131,1332],{"class":1078},[1048,7133,7134,7137,7139,7141,7143,7145,7148],{"class":1050,"line":1660},[1048,7135,7136],{"class":1065},"                    field_name ",[1048,7138,1881],{"class":1078},[1048,7140,7083],{"class":1065},[1048,7142,4196],{"class":1078},[1048,7144,5735],{"class":2284},[1048,7146,7147],{"class":1078},":]",[1048,7149,7150],{"class":1054},"  # Remove 'bulk_' prefix\n",[1048,7152,7153,7156,7158,7161,7163,7165],{"class":1050,"line":1674},[1048,7154,7155],{"class":1065},"                    update_fields",[1048,7157,4196],{"class":1078},[1048,7159,7160],{"class":1065},"field_name",[1048,7162,6829],{"class":1078},[1048,7164,1250],{"class":1078},[1048,7166,1515],{"class":1065},[1048,7168,7169],{"class":1050,"line":1679},[1048,7170,4953],{"class":1065},[1048,7172,7173,7175,7178],{"class":1050,"line":1697},[1048,7174,2833],{"class":1061},[1048,7176,7177],{"class":1065}," update_fields",[1048,7179,1332],{"class":1078},[1048,7181,7182,7185,7187,7189,7191,7194,7197],{"class":1050,"line":1707},[1048,7183,7184],{"class":1065},"                queryset",[1048,7186,1079],{"class":1078},[1048,7188,3823],{"class":1258},[1048,7190,1165],{"class":1078},[1048,7192,7193],{"class":1219},"**",[1048,7195,7196],{"class":1258},"update_fields",[1048,7198,1279],{"class":1078},[1048,7200,7201,7204,7206,7209,7211,7214,7216,7218,7221,7223,7226,7228,7231,7233,7235,7238],{"class":1050,"line":1720},[1048,7202,7203],{"class":1240},"                self",[1048,7205,1079],{"class":1078},[1048,7207,7208],{"class":1258},"message_user",[1048,7210,1165],{"class":1078},[1048,7212,7213],{"class":1258},"request",[1048,7215,1216],{"class":1078},[1048,7217,2759],{"class":1157},[1048,7219,7220],{"class":1268},"\"Updated ",[1048,7222,1807],{"class":1806},[1048,7224,7225],{"class":1258},"queryset",[1048,7227,1079],{"class":1078},[1048,7229,7230],{"class":1258},"count",[1048,7232,3009],{"class":1078},[1048,7234,1813],{"class":1806},[1048,7236,7237],{"class":1268}," objects\"",[1048,7239,1279],{"class":1078},[1048,7241,7242],{"class":1050,"line":1727},[1048,7243,4953],{"class":1065},[1048,7245,7246,7248],{"class":1050,"line":1732},[1048,7247,1512],{"class":1061},[1048,7249,2599],{"class":1275},[1048,7251,7252],{"class":1050,"line":1739},[1048,7253,1313],{"class":1065},[1048,7255,7256],{"class":1050,"line":1775},[1048,7257,7258],{"class":1054},"        # Show form\n",[1048,7260,7261,7264,7266],{"class":1050,"line":1790},[1048,7262,7263],{"class":1065},"        context ",[1048,7265,1881],{"class":1078},[1048,7267,3079],{"class":1078},[1048,7269,7270,7272,7274,7276,7278,7280],{"class":1050,"line":1820},[1048,7271,3085],{"class":1264},[1048,7273,7225],{"class":1268},[1048,7275,1265],{"class":1264},[1048,7277,3055],{"class":1078},[1048,7279,6719],{"class":1065},[1048,7281,2476],{"class":1078},[1048,7283,7284,7286,7289,7291,7293,7295,7298,7300,7303,7305,7307,7309,7311,7313,7316,7318,7320,7323,7325,7327,7330],{"class":1050,"line":1825},[1048,7285,3085],{"class":1264},[1048,7287,7288],{"class":1268},"model_fields",[1048,7290,1265],{"class":1264},[1048,7292,3055],{"class":1078},[1048,7294,3809],{"class":1078},[1048,7296,7297],{"class":1065},"f ",[1048,7299,6592],{"class":1061},[1048,7301,7302],{"class":1065}," f ",[1048,7304,3773],{"class":1061},[1048,7306,1325],{"class":1240},[1048,7308,1079],{"class":1078},[1048,7310,6744],{"class":1246},[1048,7312,1079],{"class":1078},[1048,7314,7315],{"class":1246},"_meta",[1048,7317,1079],{"class":1078},[1048,7319,6780],{"class":1246},[1048,7321,7322],{"class":1061}," if",[1048,7324,2759],{"class":1065},[1048,7326,1079],{"class":1078},[1048,7328,7329],{"class":1246},"editable",[1048,7331,7332],{"class":1078},"],\n",[1048,7334,7335],{"class":1050,"line":1831},[1048,7336,3269],{"class":1078},[1048,7338,7339,7341,7344,7346,7348,7350,7352,7355,7357,7359,7362],{"class":1050,"line":1850},[1048,7340,1663],{"class":1061},[1048,7342,7343],{"class":1258}," render",[1048,7345,1165],{"class":1078},[1048,7347,7213],{"class":1258},[1048,7349,1216],{"class":1078},[1048,7351,1357],{"class":1264},[1048,7353,7354],{"class":1268},"admin/bulk_update_form.html",[1048,7356,1265],{"class":1264},[1048,7358,1216],{"class":1078},[1048,7360,7361],{"class":1258}," context",[1048,7363,1279],{"class":1078},[1048,7365,7366],{"class":1050,"line":1860},[1048,7367,1197],{"class":1065},[1048,7369,7370,7373,7375,7377,7379,7381,7384],{"class":1050,"line":1865},[1048,7371,7372],{"class":1065},"    bulk_update_form",[1048,7374,1079],{"class":1078},[1048,7376,6971],{"class":1246},[1048,7378,1250],{"class":1078},[1048,7380,6976],{"class":1264},[1048,7382,7383],{"class":1268},"Bulk update selected",[1048,7385,2785],{"class":1264},[1048,7387,7388],{"class":1050,"line":1901},[1048,7389,1151],{"emptyLinePlaceholder":1150},[1048,7391,7392],{"class":1050,"line":1916},[1048,7393,7394],{"class":1054},"# Custom admin widgets\n",[1048,7396,7397,7399,7402,7404],{"class":1050,"line":1939},[1048,7398,1072],{"class":1061},[1048,7400,7401],{"class":1065}," django ",[1048,7403,1062],{"class":1061},[1048,7405,7406],{"class":1065}," forms\n",[1048,7408,7409,7411,7413,7415,7417,7419,7422,7424,7427,7429],{"class":1050,"line":1944},[1048,7410,1072],{"class":1061},[1048,7412,1095],{"class":1065},[1048,7414,1079],{"class":1078},[1048,7416,4584],{"class":1065},[1048,7418,1079],{"class":1078},[1048,7420,7421],{"class":1065},"admin",[1048,7423,1079],{"class":1078},[1048,7425,7426],{"class":1065},"widgets ",[1048,7428,1062],{"class":1061},[1048,7430,7431],{"class":1065}," AdminFileWidget\n",[1048,7433,7434],{"class":1050,"line":1967},[1048,7435,1151],{"emptyLinePlaceholder":1150},[1048,7437,7438,7440,7443,7445,7448],{"class":1050,"line":1977},[1048,7439,1158],{"class":1157},[1048,7441,7442],{"class":1161}," ImagePreviewWidget",[1048,7444,1165],{"class":1078},[1048,7446,7447],{"class":1168},"AdminFileWidget",[1048,7449,1177],{"class":1078},[1048,7451,7452,7454,7457],{"class":1050,"line":1997},[1048,7453,1184],{"class":1183},[1048,7455,7456],{"class":1187},"Widget that shows image preview",[1048,7458,1191],{"class":1183},[1048,7460,7461],{"class":1050,"line":2002},[1048,7462,1197],{"class":1065},[1048,7464,7465,7467,7469,7471,7473,7475,7477,7479,7481,7483,7486,7488,7490,7492,7495,7497,7499],{"class":1050,"line":2026},[1048,7466,1203],{"class":1157},[1048,7468,7343],{"class":1458},[1048,7470,1165],{"class":1078},[1048,7472,1213],{"class":1212},[1048,7474,1216],{"class":1078},[1048,7476,2362],{"class":1223},[1048,7478,1216],{"class":1078},[1048,7480,1468],{"class":1223},[1048,7482,1216],{"class":1078},[1048,7484,7485],{"class":1223}," attrs",[1048,7487,1881],{"class":1219},[1048,7489,1884],{"class":1275},[1048,7491,1216],{"class":1078},[1048,7493,7494],{"class":1223}," renderer",[1048,7496,1881],{"class":1219},[1048,7498,1884],{"class":1275},[1048,7500,1177],{"class":1078},[1048,7502,7503,7506,7508,7510,7512,7515,7517,7519,7521,7523,7525,7527,7529,7531],{"class":1050,"line":2034},[1048,7504,7505],{"class":1065},"        output ",[1048,7507,1881],{"class":1078},[1048,7509,3626],{"class":1285},[1048,7511,1289],{"class":1078},[1048,7513,7514],{"class":1258},"render",[1048,7516,1165],{"class":1078},[1048,7518,3636],{"class":1258},[1048,7520,1216],{"class":1078},[1048,7522,1468],{"class":1258},[1048,7524,1216],{"class":1078},[1048,7526,7485],{"class":1258},[1048,7528,1216],{"class":1078},[1048,7530,7494],{"class":1258},[1048,7532,1279],{"class":1078},[1048,7534,7535],{"class":1050,"line":2043},[1048,7536,1313],{"class":1065},[1048,7538,7539,7541,7543,7546,7548,7550,7552,7554,7556,7559,7561],{"class":1050,"line":2067},[1048,7540,1319],{"class":1061},[1048,7542,1499],{"class":1065},[1048,7544,7545],{"class":1219},"and",[1048,7547,2428],{"class":1206},[1048,7549,1165],{"class":1078},[1048,7551,1549],{"class":1258},[1048,7553,1216],{"class":1078},[1048,7555,1357],{"class":1264},[1048,7557,7558],{"class":1268},"url",[1048,7560,1265],{"class":1264},[1048,7562,1177],{"class":1078},[1048,7564,7565,7568,7571,7573],{"class":1050,"line":2087},[1048,7566,7567],{"class":1065},"            output ",[1048,7569,7570],{"class":1078},"+=",[1048,7572,2759],{"class":1157},[1048,7574,7575],{"class":1268},"'''\n",[1048,7577,7578],{"class":1050,"line":2117},[1048,7579,7580],{"class":1268},"            \u003Cdiv style=\"margin-top: 10px;\">\n",[1048,7582,7583,7586,7588,7590,7592,7594,7596],{"class":1050,"line":2127},[1048,7584,7585],{"class":1268},"                \u003Cimg src=\"",[1048,7587,1807],{"class":1806},[1048,7589,1549],{"class":1065},[1048,7591,1079],{"class":1078},[1048,7593,7558],{"class":1246},[1048,7595,1813],{"class":1806},[1048,7597,7598],{"class":1268},"\" style=\"max-width: 200px; max-height: 200px;\" />\n",[1048,7600,7601],{"class":1050,"line":2133},[1048,7602,7603],{"class":1268},"            \u003C/div>\n",[1048,7605,7606],{"class":1050,"line":2139},[1048,7607,7608],{"class":1268},"            '''\n",[1048,7610,7611],{"class":1050,"line":2144},[1048,7612,1313],{"class":1065},[1048,7614,7615,7617],{"class":1050,"line":2150},[1048,7616,1663],{"class":1061},[1048,7618,7619],{"class":1065}," output\n",[1048,7621,7622],{"class":1050,"line":2163},[1048,7623,1151],{"emptyLinePlaceholder":1150},[1048,7625,7626,7628,7631,7633,7636,7638,7641],{"class":1050,"line":2168},[1048,7627,1158],{"class":1157},[1048,7629,7630],{"class":1161}," ColorPickerWidget",[1048,7632,1165],{"class":1078},[1048,7634,7635],{"class":1168},"forms",[1048,7637,1079],{"class":1078},[1048,7639,7640],{"class":1168},"TextInput",[1048,7642,1177],{"class":1078},[1048,7644,7645,7647,7650],{"class":1050,"line":2187},[1048,7646,1184],{"class":1183},[1048,7648,7649],{"class":1187},"Color picker widget",[1048,7651,1191],{"class":1183},[1048,7653,7654],{"class":1050,"line":2197},[1048,7655,1197],{"class":1065},[1048,7657,7658,7660,7662,7664,7666,7668,7670,7672,7674],{"class":1050,"line":2202},[1048,7659,1203],{"class":1157},[1048,7661,1207],{"class":1206},[1048,7663,1165],{"class":1078},[1048,7665,1213],{"class":1212},[1048,7667,1216],{"class":1078},[1048,7669,7485],{"class":1223},[1048,7671,1881],{"class":1219},[1048,7673,1884],{"class":1275},[1048,7675,1177],{"class":1078},[1048,7677,7678,7681,7683,7685,7687,7689,7691,7693,7695,7698,7700],{"class":1050,"line":2236},[1048,7679,7680],{"class":1065},"        default_attrs ",[1048,7682,1881],{"class":1078},[1048,7684,2774],{"class":1078},[1048,7686,1265],{"class":1264},[1048,7688,3050],{"class":1268},[1048,7690,1265],{"class":1264},[1048,7692,3055],{"class":1078},[1048,7694,1357],{"class":1264},[1048,7696,7697],{"class":1268},"color",[1048,7699,1265],{"class":1264},[1048,7701,3251],{"class":1078},[1048,7703,7704,7706,7708],{"class":1050,"line":2262},[1048,7705,1319],{"class":1061},[1048,7707,7485],{"class":1065},[1048,7709,1332],{"class":1078},[1048,7711,7712,7715,7717,7719,7721,7724],{"class":1050,"line":2290},[1048,7713,7714],{"class":1065},"            default_attrs",[1048,7716,1079],{"class":1078},[1048,7718,3823],{"class":1258},[1048,7720,1165],{"class":1078},[1048,7722,7723],{"class":1258},"attrs",[1048,7725,1279],{"class":1078},[1048,7727,7728,7730,7732,7734,7736,7739],{"class":1050,"line":2315},[1048,7729,1286],{"class":1285},[1048,7731,1289],{"class":1078},[1048,7733,1292],{"class":1206},[1048,7735,1165],{"class":1078},[1048,7737,7738],{"class":1258},"default_attrs",[1048,7740,1279],{"class":1078},[1048,7742,7743],{"class":1050,"line":2338},[1048,7744,1151],{"emptyLinePlaceholder":1150},[1048,7746,7747],{"class":1050,"line":2343},[1048,7748,7749],{"class":1054},"# Advanced admin class\n",[1048,7751,7752,7755,7757,7759,7762,7764,7767],{"class":1050,"line":2373},[1048,7753,7754],{"class":1078},"@",[1048,7756,7421],{"class":1458},[1048,7758,1079],{"class":1078},[1048,7760,7761],{"class":1458},"register",[1048,7763,1165],{"class":1078},[1048,7765,7766],{"class":1258},"Product",[1048,7768,1279],{"class":1078},[1048,7770,7771,7773,7776,7778,7780,7782,7785,7787,7789,7791,7793],{"class":1050,"line":2383},[1048,7772,1158],{"class":1157},[1048,7774,7775],{"class":1161}," ProductAdmin",[1048,7777,1165],{"class":1078},[1048,7779,7421],{"class":1168},[1048,7781,1079],{"class":1078},[1048,7783,7784],{"class":1168},"ModelAdmin",[1048,7786,1216],{"class":1078},[1048,7788,6684],{"class":1168},[1048,7790,1216],{"class":1078},[1048,7792,6992],{"class":1168},[1048,7794,1177],{"class":1078},[1048,7796,7797,7799,7802],{"class":1050,"line":2410},[1048,7798,1184],{"class":1183},[1048,7800,7801],{"class":1187},"Advanced product admin",[1048,7803,1191],{"class":1183},[1048,7805,7806],{"class":1050,"line":2415},[1048,7807,1197],{"class":1065},[1048,7809,7810,7813,7815,7817,7819,7821,7823,7825,7827,7830,7832,7834,7836,7839,7841,7843,7845,7848,7850,7852,7854,7857,7859],{"class":1050,"line":2421},[1048,7811,7812],{"class":1065},"    list_display ",[1048,7814,1881],{"class":1078},[1048,7816,3809],{"class":1078},[1048,7818,1265],{"class":1264},[1048,7820,3636],{"class":1268},[1048,7822,1265],{"class":1264},[1048,7824,1216],{"class":1078},[1048,7826,1357],{"class":1264},[1048,7828,7829],{"class":1268},"price",[1048,7831,1265],{"class":1264},[1048,7833,1216],{"class":1078},[1048,7835,1357],{"class":1264},[1048,7837,7838],{"class":1268},"category",[1048,7840,1265],{"class":1264},[1048,7842,1216],{"class":1078},[1048,7844,1357],{"class":1264},[1048,7846,7847],{"class":1268},"is_active",[1048,7849,1265],{"class":1264},[1048,7851,1216],{"class":1078},[1048,7853,1357],{"class":1264},[1048,7855,7856],{"class":1268},"created_at",[1048,7858,1265],{"class":1264},[1048,7860,4202],{"class":1078},[1048,7862,7863,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892],{"class":1050,"line":2445},[1048,7864,7865],{"class":1065},"    list_filter ",[1048,7867,1881],{"class":1078},[1048,7869,3809],{"class":1078},[1048,7871,1265],{"class":1264},[1048,7873,7838],{"class":1268},[1048,7875,1265],{"class":1264},[1048,7877,1216],{"class":1078},[1048,7879,1357],{"class":1264},[1048,7881,7847],{"class":1268},[1048,7883,1265],{"class":1264},[1048,7885,1216],{"class":1078},[1048,7887,1357],{"class":1264},[1048,7889,7856],{"class":1268},[1048,7891,1265],{"class":1264},[1048,7893,4202],{"class":1078},[1048,7895,7896,7899,7901,7903,7905,7907,7909,7911,7913,7916,7918],{"class":1050,"line":2464},[1048,7897,7898],{"class":1065},"    search_fields ",[1048,7900,1881],{"class":1078},[1048,7902,3809],{"class":1078},[1048,7904,1265],{"class":1264},[1048,7906,3636],{"class":1268},[1048,7908,1265],{"class":1264},[1048,7910,1216],{"class":1078},[1048,7912,1357],{"class":1264},[1048,7914,7915],{"class":1268},"description",[1048,7917,1265],{"class":1264},[1048,7919,4202],{"class":1078},[1048,7921,7922,7925,7927,7929,7931,7933,7935,7937,7939,7941,7943],{"class":1050,"line":2479},[1048,7923,7924],{"class":1065},"    list_editable ",[1048,7926,1881],{"class":1078},[1048,7928,3809],{"class":1078},[1048,7930,1265],{"class":1264},[1048,7932,7829],{"class":1268},[1048,7934,1265],{"class":1264},[1048,7936,1216],{"class":1078},[1048,7938,1357],{"class":1264},[1048,7940,7847],{"class":1268},[1048,7942,1265],{"class":1264},[1048,7944,4202],{"class":1078},[1048,7946,7947],{"class":1050,"line":2496},[1048,7948,1197],{"class":1065},[1048,7950,7951,7954,7956,7958,7960,7963,7965,7967,7969,7972,7974,7976,7978,7981,7983,7985,7987,7990,7992],{"class":1050,"line":2511},[1048,7952,7953],{"class":1065},"    actions ",[1048,7955,1881],{"class":1078},[1048,7957,3809],{"class":1078},[1048,7959,1265],{"class":1264},[1048,7961,7962],{"class":1268},"export_as_csv",[1048,7964,1265],{"class":1264},[1048,7966,1216],{"class":1078},[1048,7968,1357],{"class":1264},[1048,7970,7971],{"class":1268},"bulk_update_form",[1048,7973,1265],{"class":1264},[1048,7975,1216],{"class":1078},[1048,7977,1357],{"class":1264},[1048,7979,7980],{"class":1268},"make_active",[1048,7982,1265],{"class":1264},[1048,7984,1216],{"class":1078},[1048,7986,1357],{"class":1264},[1048,7988,7989],{"class":1268},"make_inactive",[1048,7991,1265],{"class":1264},[1048,7993,4202],{"class":1078},[1048,7995,7996],{"class":1050,"line":2517},[1048,7997,1197],{"class":1065},[1048,7999,8000,8003,8005],{"class":1050,"line":2541},[1048,8001,8002],{"class":1065},"    fieldsets ",[1048,8004,1881],{"class":1078},[1048,8006,8007],{"class":1078}," (\n",[1048,8009,8010,8013,8015,8018,8020,8022],{"class":1050,"line":2546},[1048,8011,8012],{"class":1078},"        (",[1048,8014,1265],{"class":1264},[1048,8016,8017],{"class":1268},"Basic Information",[1048,8019,1265],{"class":1264},[1048,8021,1216],{"class":1078},[1048,8023,3079],{"class":1078},[1048,8025,8026,8028,8030,8032,8034,8037,8039,8041,8043,8045,8047,8049,8051,8053,8055,8057,8059],{"class":1050,"line":2571},[1048,8027,3085],{"class":1264},[1048,8029,6780],{"class":1268},[1048,8031,1265],{"class":1264},[1048,8033,3055],{"class":1078},[1048,8035,8036],{"class":1078}," (",[1048,8038,1265],{"class":1264},[1048,8040,3636],{"class":1268},[1048,8042,1265],{"class":1264},[1048,8044,1216],{"class":1078},[1048,8046,1357],{"class":1264},[1048,8048,7915],{"class":1268},[1048,8050,1265],{"class":1264},[1048,8052,1216],{"class":1078},[1048,8054,1357],{"class":1264},[1048,8056,7838],{"class":1268},[1048,8058,1265],{"class":1264},[1048,8060,1279],{"class":1078},[1048,8062,8063],{"class":1050,"line":2581},[1048,8064,8065],{"class":1078},"        }),\n",[1048,8067,8068,8070,8072,8075,8077,8079],{"class":1050,"line":2594},[1048,8069,8012],{"class":1078},[1048,8071,1265],{"class":1264},[1048,8073,8074],{"class":1268},"Pricing",[1048,8076,1265],{"class":1264},[1048,8078,1216],{"class":1078},[1048,8080,3079],{"class":1078},[1048,8082,8083,8085,8087,8089,8091,8093,8095,8097,8099,8101,8103,8105,8107],{"class":1050,"line":2602},[1048,8084,3085],{"class":1264},[1048,8086,6780],{"class":1268},[1048,8088,1265],{"class":1264},[1048,8090,3055],{"class":1078},[1048,8092,8036],{"class":1078},[1048,8094,1265],{"class":1264},[1048,8096,7829],{"class":1268},[1048,8098,1265],{"class":1264},[1048,8100,1216],{"class":1078},[1048,8102,1357],{"class":1264},[1048,8104,2256],{"class":1268},[1048,8106,1265],{"class":1264},[1048,8108,8109],{"class":1078},"),\n",[1048,8111,8112,8114,8117,8119,8121,8123,8125,8128,8130],{"class":1050,"line":2637},[1048,8113,3085],{"class":1264},[1048,8115,8116],{"class":1268},"classes",[1048,8118,1265],{"class":1264},[1048,8120,3055],{"class":1078},[1048,8122,8036],{"class":1078},[1048,8124,1265],{"class":1264},[1048,8126,8127],{"class":1268},"collapse",[1048,8129,1265],{"class":1264},[1048,8131,8132],{"class":1078},",)\n",[1048,8134,8135],{"class":1050,"line":2642},[1048,8136,8065],{"class":1078},[1048,8138,8139,8141,8143,8146,8148,8150],{"class":1050,"line":2651},[1048,8140,8012],{"class":1078},[1048,8142,1265],{"class":1264},[1048,8144,8145],{"class":1268},"Status",[1048,8147,1265],{"class":1264},[1048,8149,1216],{"class":1078},[1048,8151,3079],{"class":1078},[1048,8153,8154,8156,8158,8160,8162,8164,8166,8168,8170,8172,8174,8177,8179],{"class":1050,"line":2661},[1048,8155,3085],{"class":1264},[1048,8157,6780],{"class":1268},[1048,8159,1265],{"class":1264},[1048,8161,3055],{"class":1078},[1048,8163,8036],{"class":1078},[1048,8165,1265],{"class":1264},[1048,8167,7847],{"class":1268},[1048,8169,1265],{"class":1264},[1048,8171,1216],{"class":1078},[1048,8173,1357],{"class":1264},[1048,8175,8176],{"class":1268},"featured",[1048,8178,1265],{"class":1264},[1048,8180,8109],{"class":1078},[1048,8182,8183],{"class":1050,"line":2666},[1048,8184,8065],{"class":1078},[1048,8186,8187,8189,8191,8194,8196,8198],{"class":1050,"line":2696},[1048,8188,8012],{"class":1078},[1048,8190,1265],{"class":1264},[1048,8192,8193],{"class":1268},"Metadata",[1048,8195,1265],{"class":1264},[1048,8197,1216],{"class":1078},[1048,8199,3079],{"class":1078},[1048,8201,8202,8204,8206,8208,8210,8212,8214,8216,8218,8220,8222,8225,8227],{"class":1050,"line":2721},[1048,8203,3085],{"class":1264},[1048,8205,6780],{"class":1268},[1048,8207,1265],{"class":1264},[1048,8209,3055],{"class":1078},[1048,8211,8036],{"class":1078},[1048,8213,1265],{"class":1264},[1048,8215,7856],{"class":1268},[1048,8217,1265],{"class":1264},[1048,8219,1216],{"class":1078},[1048,8221,1357],{"class":1264},[1048,8223,8224],{"class":1268},"updated_at",[1048,8226,1265],{"class":1264},[1048,8228,8109],{"class":1078},[1048,8230,8231,8233,8235,8237,8239,8241,8243,8245,8247],{"class":1050,"line":2735},[1048,8232,3085],{"class":1264},[1048,8234,8116],{"class":1268},[1048,8236,1265],{"class":1264},[1048,8238,3055],{"class":1078},[1048,8240,8036],{"class":1078},[1048,8242,1265],{"class":1264},[1048,8244,8127],{"class":1268},[1048,8246,1265],{"class":1264},[1048,8248,8249],{"class":1078},",),\n",[1048,8251,8252],{"class":1050,"line":2740},[1048,8253,8065],{"class":1078},[1048,8255,8256],{"class":1050,"line":2754},[1048,8257,8258],{"class":1078},"    )\n",[1048,8260,8261],{"class":1050,"line":2788},[1048,8262,1197],{"class":1065},[1048,8264,8265,8268,8270,8272,8274,8276,8278,8280,8282,8284,8286],{"class":1050,"line":2793},[1048,8266,8267],{"class":1065},"    readonly_fields ",[1048,8269,1881],{"class":1078},[1048,8271,3809],{"class":1078},[1048,8273,1265],{"class":1264},[1048,8275,7856],{"class":1268},[1048,8277,1265],{"class":1264},[1048,8279,1216],{"class":1078},[1048,8281,1357],{"class":1264},[1048,8283,8224],{"class":1268},[1048,8285,1265],{"class":1264},[1048,8287,4202],{"class":1078},[1048,8289,8290],{"class":1050,"line":2812},[1048,8291,1197],{"class":1065},[1048,8293,8294,8296,8299,8301,8303,8305,8307,8309,8311],{"class":1050,"line":2830},[1048,8295,1203],{"class":1157},[1048,8297,8298],{"class":1458}," make_active",[1048,8300,1165],{"class":1078},[1048,8302,1213],{"class":1212},[1048,8304,1216],{"class":1078},[1048,8306,4723],{"class":1223},[1048,8308,1216],{"class":1078},[1048,8310,6719],{"class":1223},[1048,8312,1177],{"class":1078},[1048,8314,8315,8317,8320],{"class":1050,"line":2853},[1048,8316,1486],{"class":1183},[1048,8318,8319],{"class":1187},"Make selected products active",[1048,8321,1191],{"class":1183},[1048,8323,8324,8327,8329,8331,8333,8335,8337,8339,8341,8343],{"class":1050,"line":2871},[1048,8325,8326],{"class":1065},"        updated ",[1048,8328,1881],{"class":1078},[1048,8330,6719],{"class":1065},[1048,8332,1079],{"class":1078},[1048,8334,3823],{"class":1258},[1048,8336,1165],{"class":1078},[1048,8338,7847],{"class":2467},[1048,8340,1881],{"class":1078},[1048,8342,5423],{"class":1275},[1048,8344,1279],{"class":1078},[1048,8346,8347,8349,8351,8353,8355,8357,8359,8361,8364,8366,8369,8371,8374],{"class":1050,"line":2905},[1048,8348,1241],{"class":1240},[1048,8350,1079],{"class":1078},[1048,8352,7208],{"class":1258},[1048,8354,1165],{"class":1078},[1048,8356,7213],{"class":1258},[1048,8358,1216],{"class":1078},[1048,8360,2759],{"class":1157},[1048,8362,8363],{"class":1268},"\"Made ",[1048,8365,1807],{"class":1806},[1048,8367,8368],{"class":1258},"updated",[1048,8370,1813],{"class":1806},[1048,8372,8373],{"class":1268}," products active\"",[1048,8375,1279],{"class":1078},[1048,8377,8378],{"class":1050,"line":2943},[1048,8379,1197],{"class":1065},[1048,8381,8382,8384,8387,8389,8391,8393,8395,8397,8399],{"class":1050,"line":2948},[1048,8383,1203],{"class":1157},[1048,8385,8386],{"class":1458}," make_inactive",[1048,8388,1165],{"class":1078},[1048,8390,1213],{"class":1212},[1048,8392,1216],{"class":1078},[1048,8394,4723],{"class":1223},[1048,8396,1216],{"class":1078},[1048,8398,6719],{"class":1223},[1048,8400,1177],{"class":1078},[1048,8402,8403,8405,8408],{"class":1050,"line":2954},[1048,8404,1486],{"class":1183},[1048,8406,8407],{"class":1187},"Make selected products inactive",[1048,8409,1191],{"class":1183},[1048,8411,8412,8414,8416,8418,8420,8422,8424,8426,8428,8430],{"class":1050,"line":2973},[1048,8413,8326],{"class":1065},[1048,8415,1881],{"class":1078},[1048,8417,6719],{"class":1065},[1048,8419,1079],{"class":1078},[1048,8421,3823],{"class":1258},[1048,8423,1165],{"class":1078},[1048,8425,7847],{"class":2467},[1048,8427,1881],{"class":1078},[1048,8429,5448],{"class":1275},[1048,8431,1279],{"class":1078},[1048,8433,8434,8436,8438,8440,8442,8444,8446,8448,8450,8452,8454,8456,8459],{"class":1050,"line":2999},[1048,8435,1241],{"class":1240},[1048,8437,1079],{"class":1078},[1048,8439,7208],{"class":1258},[1048,8441,1165],{"class":1078},[1048,8443,7213],{"class":1258},[1048,8445,1216],{"class":1078},[1048,8447,2759],{"class":1157},[1048,8449,8363],{"class":1268},[1048,8451,1807],{"class":1806},[1048,8453,8368],{"class":1258},[1048,8455,1813],{"class":1806},[1048,8457,8458],{"class":1268}," products inactive\"",[1048,8460,1279],{"class":1078},[1048,8462,8463],{"class":1050,"line":3015},[1048,8464,1197],{"class":1065},[1048,8466,8467,8469,8472,8474,8476,8478,8480],{"class":1050,"line":3027},[1048,8468,1203],{"class":1157},[1048,8470,8471],{"class":1458}," get_queryset",[1048,8473,1165],{"class":1078},[1048,8475,1213],{"class":1212},[1048,8477,1216],{"class":1078},[1048,8479,4723],{"class":1223},[1048,8481,1177],{"class":1078},[1048,8483,8484,8486,8489],{"class":1050,"line":3044},[1048,8485,1486],{"class":1183},[1048,8487,8488],{"class":1187},"Optimize queryset",[1048,8490,1191],{"class":1183},[1048,8492,8493,8495,8497,8499,8502,8504,8506,8508,8511,8513,8515,8517,8519],{"class":1050,"line":3067},[1048,8494,1663],{"class":1061},[1048,8496,3626],{"class":1285},[1048,8498,1289],{"class":1078},[1048,8500,8501],{"class":1258},"get_queryset",[1048,8503,1165],{"class":1078},[1048,8505,7213],{"class":1258},[1048,8507,1764],{"class":1078},[1048,8509,8510],{"class":1258},"select_related",[1048,8512,1165],{"class":1078},[1048,8514,1265],{"class":1264},[1048,8516,7838],{"class":1268},[1048,8518,1265],{"class":1264},[1048,8520,1279],{"class":1078},[1048,8522,8523],{"class":1050,"line":3082},[1048,8524,1197],{"class":1065},[1048,8526,8527,8529,8532,8534,8536,8538,8541,8543,8545,8547,8549,8551],{"class":1050,"line":3115},[1048,8528,1203],{"class":1157},[1048,8530,8531],{"class":1458}," formfield_for_dbfield",[1048,8533,1165],{"class":1078},[1048,8535,1213],{"class":1212},[1048,8537,1216],{"class":1078},[1048,8539,8540],{"class":1223}," db_field",[1048,8542,1216],{"class":1078},[1048,8544,4723],{"class":1223},[1048,8546,1216],{"class":1078},[1048,8548,1229],{"class":1219},[1048,8550,1232],{"class":1223},[1048,8552,1177],{"class":1078},[1048,8554,8555,8557,8560],{"class":1050,"line":3129},[1048,8556,1486],{"class":1183},[1048,8558,8559],{"class":1187},"Customize form fields",[1048,8561,1191],{"class":1183},[1048,8563,8564,8566,8568,8570,8572,8574,8576,8579,8581],{"class":1050,"line":3149},[1048,8565,1319],{"class":1061},[1048,8567,8540],{"class":1065},[1048,8569,1079],{"class":1078},[1048,8571,3636],{"class":1246},[1048,8573,7051],{"class":1219},[1048,8575,1357],{"class":1264},[1048,8577,8578],{"class":1268},"image",[1048,8580,1265],{"class":1264},[1048,8582,1332],{"class":1078},[1048,8584,8585,8588,8590,8592,8595,8597,8599,8601],{"class":1050,"line":3162},[1048,8586,8587],{"class":1065},"            kwargs",[1048,8589,4196],{"class":1078},[1048,8591,1265],{"class":1264},[1048,8593,8594],{"class":1268},"widget",[1048,8596,1265],{"class":1264},[1048,8598,6829],{"class":1078},[1048,8600,1250],{"class":1078},[1048,8602,8603],{"class":1065}," ImagePreviewWidget\n",[1048,8605,8606,8609,8611,8613,8615,8617,8619,8621,8623],{"class":1050,"line":3193},[1048,8607,8608],{"class":1061},"        elif",[1048,8610,8540],{"class":1065},[1048,8612,1079],{"class":1078},[1048,8614,3636],{"class":1246},[1048,8616,7051],{"class":1219},[1048,8618,1357],{"class":1264},[1048,8620,7697],{"class":1268},[1048,8622,1265],{"class":1264},[1048,8624,1332],{"class":1078},[1048,8626,8627,8629,8631,8633,8635,8637,8639,8641],{"class":1050,"line":3223},[1048,8628,8587],{"class":1065},[1048,8630,4196],{"class":1078},[1048,8632,1265],{"class":1264},[1048,8634,8594],{"class":1268},[1048,8636,1265],{"class":1264},[1048,8638,6829],{"class":1078},[1048,8640,1250],{"class":1078},[1048,8642,8643],{"class":1065}," ColorPickerWidget\n",[1048,8645,8646],{"class":1050,"line":3254},[1048,8647,1313],{"class":1065},[1048,8649,8650,8652,8654,8656,8659,8661,8664,8666,8668,8670,8672,8674],{"class":1050,"line":3260},[1048,8651,1663],{"class":1061},[1048,8653,3626],{"class":1285},[1048,8655,1289],{"class":1078},[1048,8657,8658],{"class":1258},"formfield_for_dbfield",[1048,8660,1165],{"class":1078},[1048,8662,8663],{"class":1258},"db_field",[1048,8665,1216],{"class":1078},[1048,8667,4723],{"class":1258},[1048,8669,1216],{"class":1078},[1048,8671,1229],{"class":1219},[1048,8673,1232],{"class":1258},[1048,8675,1279],{"class":1078},[1048,8677,8678],{"class":1050,"line":3266},[1048,8679,1151],{"emptyLinePlaceholder":1150},[1048,8681,8682],{"class":1050,"line":3272},[1048,8683,8684],{"class":1054},"# Custom admin site\n",[1048,8686,8687,8689,8692,8694,8696,8698,8701],{"class":1050,"line":6432},[1048,8688,1158],{"class":1157},[1048,8690,8691],{"class":1161}," CustomAdminSite",[1048,8693,1165],{"class":1078},[1048,8695,7421],{"class":1168},[1048,8697,1079],{"class":1078},[1048,8699,8700],{"class":1168},"AdminSite",[1048,8702,1177],{"class":1078},[1048,8704,8705,8707,8710],{"class":1050,"line":6445},[1048,8706,1184],{"class":1183},[1048,8708,8709],{"class":1187},"Custom admin site with additional features",[1048,8711,1191],{"class":1183},[1048,8713,8714],{"class":1050,"line":6450},[1048,8715,1197],{"class":1065},[1048,8717,8718,8721,8723,8725,8728],{"class":1050,"line":6455},[1048,8719,8720],{"class":1065},"    site_header ",[1048,8722,1881],{"class":1078},[1048,8724,6976],{"class":1264},[1048,8726,8727],{"class":1268},"MyApp Administration",[1048,8729,2785],{"class":1264},[1048,8731,8732,8735,8737,8739,8742],{"class":1050,"line":6471},[1048,8733,8734],{"class":1065},"    site_title ",[1048,8736,1881],{"class":1078},[1048,8738,6976],{"class":1264},[1048,8740,8741],{"class":1268},"MyApp Admin",[1048,8743,2785],{"class":1264},[1048,8745,8746,8749,8751,8753,8756],{"class":1050,"line":6476},[1048,8747,8748],{"class":1065},"    index_title ",[1048,8750,1881],{"class":1078},[1048,8752,6976],{"class":1264},[1048,8754,8755],{"class":1268},"Welcome to MyApp Administration",[1048,8757,2785],{"class":1264},[1048,8759,8760],{"class":1050,"line":6494},[1048,8761,1197],{"class":1065},[1048,8763,8764,8766,8769,8771,8773,8775,8777,8779,8782,8784,8786],{"class":1050,"line":6504},[1048,8765,1203],{"class":1157},[1048,8767,8768],{"class":1458}," index",[1048,8770,1165],{"class":1078},[1048,8772,1213],{"class":1212},[1048,8774,1216],{"class":1078},[1048,8776,4723],{"class":1223},[1048,8778,1216],{"class":1078},[1048,8780,8781],{"class":1223}," extra_context",[1048,8783,1881],{"class":1219},[1048,8785,1884],{"class":1275},[1048,8787,1177],{"class":1078},[1048,8789,8790,8792,8795],{"class":1050,"line":6531},[1048,8791,1486],{"class":1183},[1048,8793,8794],{"class":1187},"Custom admin index with dashboard",[1048,8796,1191],{"class":1183},[1048,8798,8799,8802,8804,8807,8809],{"class":1050,"line":6536},[1048,8800,8801],{"class":1065},"        extra_context ",[1048,8803,1881],{"class":1078},[1048,8805,8806],{"class":1065}," extra_context ",[1048,8808,2251],{"class":1219},[1048,8810,7075],{"class":1078},[1048,8812,8813],{"class":1050,"line":6548},[1048,8814,1313],{"class":1065},[1048,8816,8817],{"class":1050,"line":6555},[1048,8818,8819],{"class":1054},"        # Add dashboard data\n",[1048,8821,8822,8825,8827,8829],{"class":1050,"line":6560},[1048,8823,8824],{"class":1065},"        extra_context",[1048,8826,1079],{"class":1078},[1048,8828,3823],{"class":1258},[1048,8830,8831],{"class":1078},"({\n",[1048,8833,8834,8836,8839,8841,8843,8845,8847,8849,8851,8853],{"class":1050,"line":6575},[1048,8835,3085],{"class":1264},[1048,8837,8838],{"class":1268},"total_users",[1048,8840,1265],{"class":1264},[1048,8842,3055],{"class":1078},[1048,8844,4783],{"class":1258},[1048,8846,1079],{"class":1078},[1048,8848,4788],{"class":1246},[1048,8850,1079],{"class":1078},[1048,8852,7230],{"class":1258},[1048,8854,8855],{"class":1078},"(),\n",[1048,8857,8859,8861,8864,8866,8868,8870,8872,8874,8876,8878],{"class":1050,"line":8858},153,[1048,8860,3085],{"class":1264},[1048,8862,8863],{"class":1268},"total_products",[1048,8865,1265],{"class":1264},[1048,8867,3055],{"class":1078},[1048,8869,2959],{"class":1258},[1048,8871,1079],{"class":1078},[1048,8873,4788],{"class":1246},[1048,8875,1079],{"class":1078},[1048,8877,7230],{"class":1258},[1048,8879,8855],{"class":1078},[1048,8881,8883,8885,8888,8890,8892,8895,8897,8899,8901,8904,8906,8908,8911,8913,8916,8918],{"class":1050,"line":8882},154,[1048,8884,3085],{"class":1264},[1048,8886,8887],{"class":1268},"recent_orders",[1048,8889,1265],{"class":1264},[1048,8891,3055],{"class":1078},[1048,8893,8894],{"class":1258}," Order",[1048,8896,1079],{"class":1078},[1048,8898,4788],{"class":1246},[1048,8900,1079],{"class":1078},[1048,8902,8903],{"class":1258},"order_by",[1048,8905,1165],{"class":1078},[1048,8907,1265],{"class":1264},[1048,8909,8910],{"class":1268},"-created_at",[1048,8912,1265],{"class":1264},[1048,8914,8915],{"class":1078},")[:",[1048,8917,5735],{"class":2284},[1048,8919,7332],{"class":1078},[1048,8921,8923],{"class":1050,"line":8922},155,[1048,8924,8925],{"class":1078},"        })\n",[1048,8927,8929],{"class":1050,"line":8928},156,[1048,8930,1313],{"class":1065},[1048,8932,8934,8936,8938,8940,8943,8945,8947,8949,8951],{"class":1050,"line":8933},157,[1048,8935,1663],{"class":1061},[1048,8937,3626],{"class":1285},[1048,8939,1289],{"class":1078},[1048,8941,8942],{"class":1258},"index",[1048,8944,1165],{"class":1078},[1048,8946,7213],{"class":1258},[1048,8948,1216],{"class":1078},[1048,8950,8781],{"class":1258},[1048,8952,1279],{"class":1078},[1048,8954,8956],{"class":1050,"line":8955},158,[1048,8957,1151],{"emptyLinePlaceholder":1150},[1048,8959,8961],{"class":1050,"line":8960},159,[1048,8962,8963],{"class":1054},"# Register custom admin site\n",[1048,8965,8967,8970,8972,8974,8976,8978,8980,8982,8985,8987],{"class":1050,"line":8966},160,[1048,8968,8969],{"class":1065},"custom_admin_site ",[1048,8971,1881],{"class":1078},[1048,8973,8691],{"class":1258},[1048,8975,1165],{"class":1078},[1048,8977,3636],{"class":2467},[1048,8979,1881],{"class":1078},[1048,8981,1265],{"class":1264},[1048,8983,8984],{"class":1268},"custom_admin",[1048,8986,1265],{"class":1264},[1048,8988,1279],{"class":1078},[1048,8990,8992,8995,8997,8999,9001,9003,9005,9008],{"class":1050,"line":8991},161,[1048,8993,8994],{"class":1065},"custom_admin_site",[1048,8996,1079],{"class":1078},[1048,8998,7761],{"class":1258},[1048,9000,1165],{"class":1078},[1048,9002,5361],{"class":1258},[1048,9004,1216],{"class":1078},[1048,9006,9007],{"class":1258}," UserAdmin",[1048,9009,1279],{"class":1078},[1048,9011,9013,9015,9017,9019,9021,9023,9025,9027],{"class":1050,"line":9012},162,[1048,9014,8994],{"class":1065},[1048,9016,1079],{"class":1078},[1048,9018,7761],{"class":1258},[1048,9020,1165],{"class":1078},[1048,9022,7766],{"class":1258},[1048,9024,1216],{"class":1078},[1048,9026,7775],{"class":1258},[1048,9028,1279],{"class":1078},[1026,9030,9031],{},"Extending Django's core components allows you to create highly customized applications that leverage Django's architecture while adding specialized functionality. The key is understanding Django's extension points and following established patterns to ensure your customizations integrate seamlessly with the framework.",[9033,9034,9035],"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 .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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .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 .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .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 .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .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 .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 .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1043,"searchDepth":1051,"depth":1058,"links":9037},[9038,9039,9040,9041],{"id":1032,"depth":1058,"text":1033},{"id":3278,"depth":1058,"text":3279},{"id":4559,"depth":1058,"text":4560},{"id":6604,"depth":1058,"text":6605},"md",null,{},{"title":823,"description":1028},"Rrpg0hNH0fZ78BGPCRMSvEOfrU7i8jX8dDFWHhIqo-A",[9048,9050],{"title":819,"path":820,"stem":821,"description":9049,"children":-1},"Plugin architectures enable Django applications to be extended dynamically without modifying core code. This approach creates flexible, maintainable systems where functionality can be added, removed, or modified through plugins, making applications highly customizable and extensible.",{"title":827,"path":828,"stem":829,"description":9051,"children":-1},"Django's ORM provides powerful expression APIs that allow you to create custom database expressions, functions, and operations. This enables sophisticated database queries while maintaining the benefits of Django's ORM abstraction.",1772474958740]