Plone Training
2021

Training Overview

  • Mastering Plone 6 Development
    • 1. About Mastering Plone
      • 1.1. The beginning and the continuation
      • 1.2. Upcoming Trainings
      • 1.3. Previous Trainings
      • 1.4. Trainers
      • 1.5. Using the documentation for a training
        • 1.5.1. The readthedocs theme
        • 1.5.2. Exercises
      • 1.6. Building the documentation locally
        • 1.6.1. Dependencies and new build
        • 1.6.2. Update existing
        • 1.6.3. Sync the browser to your editing
        • 1.6.4. Technical set up to do before a training (as a trainer)
        • 1.6.5. Upgrade the vagrant and buildout to a new Plone-version
      • 1.7. Train the trainer
      • 1.8. Contributing
      • 1.9. License
    • 2. Watch the Training Video
    • 3. Introduction
      • 3.1. Who are you?
      • 3.2. Classroom Protocol
      • 3.3. Documentation
      • 3.4. Further Reading
    • 4. The Case Study
      • 4.1. Background
      • 4.2. Requirements
      • 4.3. Changing requirements
      • 4.4. Tasks
      • 4.5. What will we do?
      • 4.6. What will we not do?
    • 5. What is Plone?
      • 5.1. Core concepts
        • 5.1.1. Traversal
        • 5.1.2. Object publishing
        • 5.1.3. Schema-driven content
        • 5.1.4. Component Architecture
        • 5.1.5. Rest API
        • 5.1.6. Volto Frontend
        • 5.1.7. Classic Frontend
    • 6. Installation & Setup
      • 6.1. Installing Plone
      • 6.2. Installing Volto
      • 6.3. Hosting Plone
      • 6.4. Production Deployment
    • 7. Installing Plone for the Training
      • 7.1. Installing Plone without vagrant
        • 7.1.1. Installing the backend
        • 7.1.2. Installing the frontend
      • 7.2. Installing Plone with Vagrant
        • 7.2.1. Install VirtualBox
        • 7.2.2. Install and configure Vagrant
        • 7.2.3. What Vagrant does
    • 8. The Features of Plone
      • 8.1. Starting and Stopping Plone
      • 8.2. Creating a Plone Site
      • 8.3. Starting and Stopping the frontend
        • 8.3.1. Exercises
      • 8.4. Walkthrough of the UI
      • 8.5. Users
      • 8.6. Configure a Mailserver
      • 8.7. The site structure
      • 8.8. Default content types
      • 8.9. Folders
      • 8.10. Collections
      • 8.11. Content Rules
      • 8.12. History
      • 8.13. Manage members and groups
      • 8.14. Workflows
      • 8.15. Working copy
      • 8.16. Placeful workflows
    • 9. The Anatomy of Plone
      • 9.1. Database
      • 9.2. Zope
      • 9.3. Content Management Framework
      • 9.4. Zope Toolkit / Zope3
      • 9.5. Zope Component Architecture (ZCA)
      • 9.6. Pyramid
      • 9.7. Exercise
      • 9.8. Plone
      • 9.9. REST API
      • 9.10. Volto
    • 10. What’s New in Plone?
      • 10.1. Plone 5.0
        • 10.1.1. Content Types
        • 10.1.2. Default Theme
        • 10.1.3. New UI and widgets
        • 10.1.4. Folder Contents
        • 10.1.5. Resource Registry
        • 10.1.6. Chameleon template engine
        • 10.1.7. Control panel
        • 10.1.8. Date formatting on the client side
        • 10.1.9. plone.app.multilingual
        • 10.1.10. New portlet manager
      • 10.2. Plone 5.1
      • 10.3. Plone 5.2
      • 10.4. Plone 6
    • 11. Volto Basics
    • 12. Configuring and Customizing Plone “Through The Web”
      • 12.1. The Control Panel
        • 12.1.1. General
        • 12.1.2. Content
        • 12.1.3. Users
        • 12.1.4. Security
        • 12.1.5. Advanced
      • 12.2. Portlets
      • 12.3. Viewlets
      • 12.4. ZMI (Zope Management Interface)
        • 12.4.1. Actions (portal_actions)
        • 12.4.2. portal_view_customizations
        • 12.4.3. Further tools in the ZMI
      • 12.5. Summary
    • 13. Customizing Volto Components
      • 13.1. Component shadowing
      • 13.2. The Logo
      • 13.3. The Footer
      • 13.4. The News Item View
      • 13.5. The Summary View
      • 13.6. The Listing Block
      • 13.7. Localization
      • 13.8. Summary
    • 14. Semantic UI
    • 15. Theming in Volto
      • 15.1. Changing the favicon
    • 16. Extending Plone
      • 16.1. Extension technologies
        • 16.1.1. Component Architecture
        • 16.1.2. Configuring Zope Components with ZCML
        • 16.1.3. GenericSetup
    • 17. Extending Plone With Add-on Packages
      • 17.1. Some notable Plone add-ons for a classic Plone setup without Volto frontend
      • 17.2. How to find add-ons
      • 17.3. Installing Plone Add-ons
        • 17.3.1. Making the add-on packages available to Zope
        • 17.3.2. Installing add-ons in your Plone Site
      • 17.4. collective.easyform
      • 17.5. Add page layout management with plone.app.mosaic
      • 17.6. Internationalization
      • 17.7. Summary classic Plone
    • 18. Buildout I
      • 18.1. Minimal Example
      • 18.2. Syntax
      • 18.3. Recipes
      • 18.4. Variables and References
      • 18.5. A real life example
      • 18.6. Mr. Developer
      • 18.7. Extensible
      • 18.8. Be McGuyver
    • 19. Write Your Own Python Add-On to Customize Plone
      • 19.1. Creating the package
      • 19.2. Volto Add-ons
      • 19.3. Eggs
      • 19.4. Inspecting the new package
      • 19.5. Including the package in Plone
      • 19.6. Exercises
      • 19.7. Summary
    • 20. Dexterity I: Content types
      • 20.1. What is a content type?
      • 20.2. The makings of a Plone content type
      • 20.3. Schemas, Fields and Values
      • 20.4. Behaviors
      • 20.5. Modifying existing types
      • 20.6. Creating content types TTW
      • 20.7. Exercises
        • 20.7.1. Exercise 1
    • 21. Dexterity II: Talks
      • 21.1. The type registration
      • 21.2. The fti
      • 21.3. The schema
      • 21.4. The instance class
      • 21.5. Try the new type
      • 21.6. Summary
    • 22. Dexterity: Reference
      • 22.1. Fields included in Plone
      • 22.2. How fields look like
        • 22.2.1. Backend
        • 22.2.2. Frontend
      • 22.3. 3rd party fields
      • 22.4. Datagrid Field
      • 22.5. Widgets
      • 22.6. Directives
        • 22.6.1. Validation and default values
    • 23. Volto View Components: A Default View for “Talk”
    • 24. Behaviors
      • 24.1. Dexterity Approach
      • 24.2. Names and Theory
      • 24.3. Practical example
      • 24.4. Adding it to our talk
      • 24.5. Add a index for the new field
      • 24.6. Add a metadata column for the new field
      • 24.7. Exercises
        • 24.7.1. Exercise 1
    • 25. Creating a dynamic frontpage with Volto blocks
      • 25.1. Add Index as collection criteria
      • 25.2. Add listing block to show featured content
    • 26. Volto View Components: A Listing View for Talks
      • 26.1. Register the view in Volto and Plone
      • 26.2. Display the content of a folder
      • 26.3. Using the search endpoint
      • 26.4. Search options
      • 26.5. Exercises
        • 26.5.1. Exercise 1
        • 26.5.2. Exercise 2
    • 27. Programming Plone
      • 27.1. plone.api
      • 27.2. portal-tools
      • 27.3. Debugging
      • 27.4. Exercise
    • 28. IDEs and Editors
    • 29. Custom Search
      • 29.1. eea.facetednavigation
      • 29.2. collective.collectionfilter
    • 30. Turning Talks into Events
      • 30.1. Add date fields
      • 30.2. Display the dates
      • 30.3. Hiding fields from certain users
      • 30.4. Display the date in the listing
        • 30.4.1. Exercise
      • 30.5. Summary
    • 31. Vocabularies, Registry-Settings and Control Panels
      • 31.1. Introduction
      • 31.2. The Registry
      • 31.3. Registry-records
      • 31.4. Accessing and modifying records in the registry
      • 31.5. Managing custom registry records
      • 31.6. Add a custom control panel
      • 31.7. Vocabularies
      • 31.8. Using vocabularies in a schema
      • 31.9. Summary
    • 32. Upgrade-steps
      • 32.1. Upgrade steps
      • 32.2. Browserlayers
      • 32.3. Add catalog indexes
      • 32.4. Query for custom indexes
      • 32.5. Exercise 1
      • 32.6. Add collection criteria
      • 32.7. Add versioning through GenericSetup
      • 32.8. Summary
    • 33. Testing in Plone
      • 33.1. Testing permissions, features and UI topics
      • 33.2. Testing the rendering of a component
    • 34. Using Third-Party Behaviors
      • 34.1. Add Teaser With collective.behavior.banner
    • 35. Dexterity Types III: Sponsors
      • 35.1. The Python schema
      • 35.2. The Factory Type Information, or FTI
        • 35.2.1. Exercise 1
      • 35.3. Summary
    • 36. The Sponsors Component
      • 36.1. A React component
      • 36.2. The Sponsors Component
        • 36.2.1. Customizing the Footer
        • 36.2.2. Getting the sponsors data
        • 36.2.3. Connection of component and store
        • 36.2.4. Presentation of the prepared data
      • 36.3. Exercise
      • 36.4. Summary
    • 37. Using Volto add-ons
      • 37.1. Volto Add-ons
      • 37.2. Complementing Volto with Plone add-ons
    • 38. Rich Text Editor Settings
    • 39. Custom Block
      • 39.1. Exercise
      • 39.2. Prospect
    • 40. Extending Volto With Custom Add-on Package
      • 40.1. Enrich an existing project with your new released add-on
      • 40.2. Create a new project with your new released add-on
      • 40.3. Footnotes
    • 41. Extending Volto With a FAQ Block Type
      • 41.1. Save your work to Github
      • 41.2. Footnotes
    • 42. Workflow, Roles and Permissions
      • 42.1. Self-registration
      • 42.2. Constrain types
      • 42.3. Grant local roles
      • 42.4. A custom workflow for talks
      • 42.5. Move the changes to the file system
        • 42.5.1. Import/Export the Workflow
        • 42.5.2. Enable self-registration
        • 42.5.3. Grant local roles
    • 43. Relations
      • 43.1. Creating relations in a schema
      • 43.2. Controlling what to relate to
      • 43.3. Use a tailor shaped widget for relations
      • 43.4. Accessing and displaying related items
      • 43.5. Creating RelationFields through the web
      • 43.6. Accessing relations and backrelations from code
      • 43.7. The stack
      • 43.8. RelationValues
    • 44. Creating Reusable Packages
    • 45. More Complex Behaviors
      • 45.1. Using Annotations
      • 45.2. Using Schema
      • 45.3. Writing Code
        • 45.3.1. Exercises
    • 46. A Viewlet for the Votable Behavior
      • 46.1. Voting Viewlet
      • 46.2. Writing the Viewlet code
      • 46.3. The template
      • 46.4. JavaScript code
      • 46.5. Writing 2 simple view helpers
    • 47. Making Our Package Reusable
      • 47.1. Adding permissions
      • 47.2. Using our permissions
      • 47.3. Provide defaults
    • 48. Using starzel.votable_behavior in ploneconf.site
    • 49. Releasing Your Code
    • 50. Buildout II: Getting Ready for Deployment
      • 50.1. The Starzel buildout
      • 50.2. A deployment setup
      • 50.3. Other tools we use
    • 51. Plone REST API
      • 51.1. Installing plone.restapi
      • 51.2. Explore the API
        • 51.2.1. Exercise
      • 51.3. Implementing the talklist
      • 51.4. Submit lightning talks
      • 51.5. Exercise
    • 52. The Future of Plone
    • 53. Optional
    • Using the code for the training
      • The code-package
      • Getting the code for a certain chapter
      • Moving from chapter to chapter
      • Tags
      • Updating the code-package
    • Timetable
      • Ploneconf 2020
      • Ploneconf 2017
      • Version 1.2
      • Version 1.1
  • Mastering Plone 5 Development
    • 1. About Mastering Plone
      • 1.1. Upcoming Trainings
      • 1.2. Previous Trainings
      • 1.3. Trainers
      • 1.4. Using the documentation for a training
        • 1.4.1. The readthedocs theme
        • 1.4.2. Exercises
      • 1.5. Building the documentation locally
        • 1.5.1. Dependencies
      • 1.6. Build new
        • 1.6.1. Update existing
        • 1.6.2. Technical set up to do before a training (as a trainer)
        • 1.6.3. Upgrade the vagrant and buildout to a new Plone-version
      • 1.7. Train the trainer
      • 1.8. Contributing
      • 1.9. License
    • 2. Introduction
      • 2.1. Who are you?
      • 2.2. What will we do?
      • 2.3. What will we not do?
      • 2.4. What to expect
      • 2.5. Classroom Protocol
      • 2.6. Documentation
      • 2.7. Further Reading
    • 3. What is Plone?
      • 3.1. Core concepts
        • 3.1.1. Traversal
        • 3.1.2. Object publishing
        • 3.1.3. Schema-driven content
        • 3.1.4. Component Architecture
    • 4. Installation & Setup
      • 4.1. Installing Plone
      • 4.2. Hosting Plone
      • 4.3. Production Deployment
    • 5. Installing Plone for the Training
      • 5.1. Installing Plone without vagrant
      • 5.2. Installing Plone with Vagrant
        • 5.2.1. Install VirtualBox
        • 5.2.2. Install and configure Vagrant
        • 5.2.3. What Vagrant does
    • 6. The Case Study
      • 6.1. Background
      • 6.2. Requirements
    • 7. The Features of Plone
      • 7.1. Starting and Stopping Plone
        • 7.1.1. Exercises
      • 7.2. Walkthrough of the UI
      • 7.3. Users
      • 7.4. Configure a Mailserver
      • 7.5. Content-Types
      • 7.6. Folders
      • 7.7. Collections
      • 7.8. Content Rules
      • 7.9. History
      • 7.10. Manage members and groups
      • 7.11. Workflows
      • 7.12. Working copy
      • 7.13. Placeful workflows
    • 8. The Anatomy of Plone
      • 8.1. Database
      • 8.2. Zope
      • 8.3. Content Management Framework
      • 8.4. Zope Toolkit / Zope3
      • 8.5. Zope Component Architecture (ZCA)
      • 8.6. Pyramid
      • 8.7. Exercise
    • 9. What’s New in Plone 5, 5.1 and Plone 5.2
      • 9.1. Default Theme
      • 9.2. New UI and widgets
      • 9.3. Folder Contents
      • 9.4. Content Types
      • 9.5. Resource Registry
      • 9.6. Chameleon template engine
      • 9.7. Control panel
      • 9.8. Date formatting on the client side
      • 9.9. plone.app.multilingual
      • 9.10. New portlet manager
      • 9.11. Remove portal_skins
      • 9.12. Plone 5.1
      • 9.13. Plone 5.2
    • 10. Configuring and Customizing Plone “Through The Web”
      • 10.1. The Control Panel
        • 10.1.1. General
        • 10.1.2. Content
        • 10.1.3. Users
        • 10.1.4. Security
        • 10.1.5. Advanced
      • 10.2. Portlets
      • 10.3. Viewlets
      • 10.4. ZMI (Zope Management Interface)
        • 10.4.1. Actions (portal_actions)
        • 10.4.2. portal_view_customizations
        • 10.4.3. CSS Registry (portal_css)
        • 10.4.4. Further tools in the ZMI
      • 10.5. Summary
    • 11. Theming
    • 12. Extending Plone
      • 12.1. Extension technologies
        • 12.1.1. Component Architecture
        • 12.1.2. Configuring Zope Components with ZCML
        • 12.1.3. GenericSetup
    • 13. Extend Plone With Add-On Packages
      • 13.1. Some notable add-ons
      • 13.2. How to find add-ons
      • 13.3. Installing Add-ons
        • 13.3.1. Making the add-on packages available to Zope
        • 13.3.2. Installing add-ons in your Plone Site
      • 13.4. collective.easyform
      • 13.5. Add page layout management with plone.app.mosaic
      • 13.6. Internationalization
      • 13.7. Summary
    • 14. Dexterity I: “Through The Web”
      • 14.1. What is a content type?
      • 14.2. The makings of a Plone content type
      • 14.3. Dexterity and Archetypes - A Comparison
      • 14.4. Modifying existing types
      • 14.5. Creating content types TTW
      • 14.6. Moving contenttypes into code
      • 14.7. Exercises
        • 14.7.1. Exercise 1
        • 14.7.2. Exercise 2
    • 15. Buildout I
      • 15.1. Minimal Example
      • 15.2. Syntax
      • 15.3. Recipes
      • 15.4. References
      • 15.5. A real life example
      • 15.6. Mr. Developer
      • 15.7. Extensible
      • 15.8. Be McGuyver
    • 16. Write Your Own Add-Ons to Customize Plone
      • 16.1. Creating the package
      • 16.2. Eggs
      • 16.3. Inspecting the package
      • 16.4. Including the package in Plone
      • 16.5. Exercises
      • 16.6. Summary
    • 17. Return to Dexterity: Moving contenttypes into Code
      • 17.1. Changing a widget
      • 17.2. Protect fields with permissions
        • 17.2.1. Exercise 1
      • 17.3. Summary
    • 18. Views I
      • 18.1. A simple browser view
    • 19. Page Templates
      • 19.1. TAL and TALES
        • 19.1.1. python expressions
        • 19.1.2. tal:condition
        • 19.1.3. tal:repeat
        • 19.1.4. path expressions
        • 19.1.5. Pure TAL blocks
        • 19.1.6. handling complex data in templates
      • 19.2. Chameleon
      • 19.3. Exercise 1
      • 19.4. METAL and macros
        • 19.4.1. macros in browser views
      • 19.5. Accessing Plone from the template
      • 19.6. Exercise 2
      • 19.7. Accessing other views
      • 19.8. What we missed
    • 20. Customizing Existing Templates
      • 20.1. The view for News Items
      • 20.2. The Summary View
      • 20.3. Finding the right template
      • 20.4. skin templates
      • 20.5. Summary
    • 21. Views II: A Default View for “Talk”
      • 21.1. View Classes
      • 21.2. Browser Views
      • 21.3. Reusing Browser Views
      • 21.4. The default view
      • 21.5. Using helper methods from DefaultView
      • 21.6. The complete template for talks
      • 21.7. Behind the scenes
    • 22. Views III: A Talk List
      • 22.1. Using portal_catalog
      • 22.2. brains and objects
      • 22.3. Querying the catalog
      • 22.4. Exercises
        • 22.4.1. Exercise 1
        • 22.4.2. Exercise 2
      • 22.5. The template for the listing
        • 22.5.1. Exercise
      • 22.6. Setting a custom view as default view on an object
      • 22.7. Summary
    • 23. Testing in Plone
      • 23.1. Types of tests
        • 23.1.1. Unit tests
        • 23.1.2. Integration tests
        • 23.1.3. Functional tests
        • 23.1.4. Acceptance tests
        • 23.1.5. JavaScript tests
        • 23.1.6. Doctests
      • 23.2. Writing tests
      • 23.3. Plone tests
        • 23.3.1. Getting started
      • 23.4. Robot tests
      • 23.5. More information
    • 24. Behaviors
      • 24.1. Dexterity Approach
      • 24.2. Names and Theory
      • 24.3. Practical example
      • 24.4. Adding it to our talk
    • 25. Writing Viewlets
      • 25.1. A viewlet for the featured behavior
      • 25.2. Featured viewlet
      • 25.3. Exercise 1
      • 25.4. Exercise 2
    • 26. Programming Plone
      • 26.1. plone.api
      • 26.2. portal-tools
      • 26.3. Debugging
      • 26.4. Exercise
    • 27. IDEs and Editors
    • 28. Dexterity Types II: Growing Up
      • 28.1. Add a marker interface to the talk type
        • 28.1.1. Marker Interfaces
      • 28.2. Upgrade steps
      • 28.3. Add a browserlayer
        • 28.3.1. Exercise
      • 28.4. Add catalog indexes
      • 28.5. Query for custom indexes
      • 28.6. Exercise 1
      • 28.7. Add collection criteria
      • 28.8. Add versioning through GenericSetup
      • 28.9. Summary
    • 29. Custom Search
      • 29.1. eea.facetednavigation
      • 29.2. collective.collectionfilter
    • 30. Turning Talks into Events
      • 30.1. Exercise 1
      • 30.2. Exercise 2
        • 30.2.1. Summary
    • 31. User Generated Content
      • 31.1. Self-registration
      • 31.2. Constrain types
      • 31.3. Grant local roles
      • 31.4. A custom workflow for talks
      • 31.5. Move the changes to the file system
        • 31.5.1. Import/Export the Workflow
        • 31.5.2. Enable self-registration
        • 31.5.3. Grant local roles
    • 32. Resources
    • 33. Using Third-Party Behaviors
      • 33.1. Add Teaser With collective.behavior.banner
    • 34. Dexterity Types III: Python
      • 34.1. The Python schema
      • 34.2. The Factory Type Information, or FTI
        • 34.2.1. Exercise 1
      • 34.3. The view
      • 34.4. The viewlet
      • 34.5. The template for the viewlet
        • 34.5.1. Exercise 2
        • 34.5.2. Exercise 3
    • 35. Dexterity: Reference
      • 35.1. Fields included in Plone
      • 35.2. How fields look like
      • 35.3. 3rd party fields
      • 35.4. Datagrid Field
      • 35.5. Widgets
      • 35.6. Directives
        • 35.6.1. Validation and default values
    • 36. Relations
      • 36.1. Creating relations in a schema
      • 36.2. Accessing and displaying related items
      • 36.3. Creating RelationFields through the web
      • 36.4. The stack
      • 36.5. RelationValues
      • 36.6. Accessing relations and backrelations from code
    • 37. Manage Settings with Registry, Control Panels and Vocabularies
      • 37.1. The Registry
      • 37.2. A setting
      • 37.3. Accessing and modifying values in the registry
      • 37.4. Add a custom control panel
      • 37.5. Vocabularies
    • 38. Creating a Dynamic Front Page
      • 38.1. The Front Page
      • 38.2. The template
        • 38.2.1. Exercise 1
      • 38.3. Twitter
      • 38.4. Activating the view
    • 39. Creating Reusable Packages
    • 40. More Complex Behaviors
      • 40.1. Using Annotations
      • 40.2. Using Schema
      • 40.3. Writing Code
        • 40.3.1. Exercises
    • 41. A Viewlet for the Votable Behavior
      • 41.1. Voting Viewlet
      • 41.2. Writing the Viewlet code
      • 41.3. The template
      • 41.4. JavaScript code
      • 41.5. Writing 2 simple view helpers
    • 42. Making Our Package Reusable
      • 42.1. Adding permissions
      • 42.2. Using our permissions
      • 42.3. Provide defaults
    • 43. Using starzel.votable_behavior in ploneconf.site
    • 44. Releasing Your Code
    • 45. Buildout II: Getting Ready for Deployment
      • 45.1. The Starzel buildout
      • 45.2. A deployment setup
      • 45.3. Other tools we use
    • 46. Plone REST API
      • 46.1. Installing plone.restapi
      • 46.2. Explore the API
        • 46.2.1. Exercise
      • 46.3. Implementing the talklist
      • 46.4. Submit lightning talks
      • 46.5. Exercise
    • 47. The Future of Plone
    • 48. Optional
    • Using the code for the training
      • The code-package
      • Getting the code for a certain chapter
      • Moving from chapter to chapter
      • Tags
      • Updating the code-package
    • Timetable
      • Ploneconf 2017
      • Version 1.2
      • Version 1.1
  • Plone Theming
    • Basic Customizations
      • Customize Logo
      • Customize CSS/Less Variables
    • TTW Theming I: Introduction
      • Installation
      • Two Approaches To Theming
      • What Is Diazo?
      • Principles
      • Copy Barceloneta Theme
      • Anatomy Of A Diazo Theme
        • Exercise 1 - Inspecting The manifest.cfg
      • CSS Classes For The <body> Element
        • <body> Classes For An Anonymous Visitor
        • <body> Classes For A Manager
        • Exercise 2 - Discussion About The <body> Classes
      • Custom Rules
        • Conditionally Showing Content
      • Customize CSS
    • TTW Theming II: Custom Barceloneta Theme
      • Inheriting From Barceloneta
        • Exercise 1 - Create A New Theme That Inherits From Barceloneta
      • Viewing The Unthemed Plone Site
        • Exercise 2 - Viewing The Unthemed Site
      • Diazo Rule Directives And Attributes
        • CSS Selector Based Attributes
        • XPath Selector Based Attributes
        • Exercise 3 - The <drop> Directive
        • Conditional Attributes
      • Converting An Existing HTML Template Into A Theme
        • Exercise 4 - Convert A HTML Template Into A Diazo Theme
      • Create A Visitor-Only Theme - Conditionally Enabling Barceloneta
        • Exercise 5 - Convert The Theme To Be A Visitor-Only Theme
    • TTW Theming III: Make It Reproducible
    • Theme Package I: Preparations
      • Preparing Your Setup
        • Install npm
        • Install Grunt
        • Setup A Python Virtual Environment
      • Create A Product To Handle Your Diazo Theme
        • Install mr.bob And bobtemplates.plone
        • Install zc.buildout And Bootstrap Your Development Environment
        • Inspect Your Package Source
        • Start Plone And Install Your Theme Product
    • Theme Package II: Diazo Theme
      • Use Your Own Static Mockup
      • Download And Prepare A Static Theme
        • Preparing The Template
        • Include Theme CSS
      • Using Diazo Rules To Map The Theme With Plone Content
      • Customizing The Ruleset
        • Plone Toolbar
        • Unthemed Backend
        • Login Link & Co
        • Top Navigation
        • Breadcrumbs & Co
        • Slider Only On Front Page
        • Title And Description
        • Status Messages
        • Main Content Area
        • Left And Right Columns
        • Footer Area
    • Theme Package III: Customizations
      • Understanding And Using The Grunt Build System
      • Theme manifest.cfg
      • Final CSS Customization
        • Install External CSS And JavaScript Libraries With npm And Use Them In Your Theme
      • More Diazo And plone.app.theming Details
    • Theme Package IV: Templates
      • Overriding A Plone Template
        • Example: Overriding The Event Item Template
      • Creating A New Plone Template
        • Create Dynamic Slider Content In Plone
        • Use The Dynamic Slider Content From Plone
    • Theme Package V: Initial Content
    • Theme Package VI: TinyMCE Templates
      • Create Your Own TinyMCE Templates
      • Activate TinyMCE Templates Plugin
      • Use TinyMCE Templates For Content Creation
    • Theme Package VII: Resource Registries
      • Register CSS And Less Resources In The Registry
    • Advanced Diazo
      • Modify Theme And Content On The Fly
        • Extend Rules
        • Include External Content
      • Recipes And Snippets
        • More Snippets
    • Jbot
      • Installation
      • Usage
      • Additional
    • Creating Custom Components
      • Views
      • Viewlets
      • Portlets
    • About
    • Glossary
  • JavaScript For Plone Developers
    • Setup
      • Installing Mockup
    • JavaScript Development Process
      • Code Style
      • Mockup Contributions
      • Documentation
    • RequireJS And JavaScript Modules
      • Defining A module
      • More information
    • Mockup
      • Mockup Project Structure
      • A Minimal Pattern
    • Writing Documentation For Mockup
    • Through-The-Web Development
      • portal_javascript & portal_css
      • Resource Registries
      • Add Files
      • Create The Resource
      • Create The Bundle And Wire Everything Up
      • Build The Bundle
    • Exercises
      • Exercise 1: Include a JavaScript resource TTW
        • Create your browser view
        • Add your JavaScript file
      • Exercise 2: Include JavaScript In Browser View
        • Add Your JavaScript File
        • Register Static Resource Directory
        • Register JavaScript Resource
        • Create Your Browser View
        • Load Your JavaScript Resource
        • Installation
        • Production
      • Exercise 3: Gallery Integration With Theme
        • Add Your JavaScript File
        • Including JavaScript/CSS Into Your Theme
        • Installation
        • Trying It Out
        • Production
      • Exercise 4: Gallery integration as resources
        • Add your JavaScript files
        • Register static resource directory
        • Register your JS as a resource
        • Bundle resource
        • Bundle
        • Installation
        • Running
        • Production
      • Exercise 5: Simple Pattern
        • Add Your Pattern File
        • Integrating With LESS
        • Creating Your Bundle
        • Register Static Resource Directory
        • Register Your Bundle
        • Installation
        • Running
        • Production
      • Exercise 6: Using A Pattern In A Z3C Form Widget
        • Add Your JavaScript File
        • Register Static Resource Directory
        • Register JavaScript Resource
        • Create A Custom Widget
        • Register Widget Customization
        • Installation
      • Exercise 7: Pattern Wrapping A 3rd Party Library
        • Add Your Pattern File
        • Register Static Resource Directory
        • Register Your Bundle
        • Installation
        • Running
        • Production
      • Exercise 8: Customizing Pattern
        • Add Your Pattern File
        • Register Static Resource Directory
        • Register Your Bundle
        • Installation
        • Running
      • Exercise 9: Overriding a pattern TTW
        • Installation
        • Try current pattern
        • Choose the pattern to override
        • Recompile bundle
        • Testing
      • Exercise 10: NG2 APP Component Rendered In A Browser View
        • Bootstrap
        • Add Your Angular 2 Component
        • Register Static Resource Directory
        • Build The File With Webpack
        • Register JavaScript Resource
        • Create Your Browser View
        • Load Your JavaScript Resource
        • Installation
        • Production
      • Exercise 11: NG2 APP Component In a A bundle
        • Bootstrap
        • Add Your Angular 2 Component
        • Register Static Resource Directory
        • Build The File With Webpack
        • Register JavaScript Resource As A Bundle
        • Installation
        • Running
        • Development
        • Production
      • Exercise 12: NG2 APP In Logged In Bundle
        • Bootstrap
        • Add Your Angular 2 Component
        • Register Static Resource Directory
        • Build The File With Webpack
        • Register JavaScript Resource
        • Installation
        • Running
        • Development
      • Exercise 13: Pattern with React
        • Add Your Pattern File
        • Register Static Resource Directory
        • Register Your Bundle
        • Installation
        • Running
        • Production
    • Scratchpad
      • General Advises
      • Structure
    • About
    • Glossary
  • Automating Plone Deployment
    • Introduction
      • Our Choices
    • Intro To Plone Stack
    • Intro To Ansible
      • Installation
      • Ansible Basics
        • Connecting To Remote Machines
        • Inventories
      • Playbooks
        • Quick Intro To YAML
        • Quick Intro To Jinja2
      • Playbook Structure
        • Variables
        • Notifications And Handlers
        • Roles
    • The Plone Playbook
      • Supported Platforms
        • Quick review of contents
    • Basic Use Of The Playbook
      • Local Configuration File
      • Use With Vagrant
        • Vagrant Ports
        • Some Quick Vagrant
      • Run Against Cloud
        • Smoke Test
        • Diagnosing SSH Connection Failures
        • Running The Playbook
        • Firewalling
    • In Operation
      • Plone Setup And Directories
        • Restart Script
        • Client Logs
        • Cron Jobs
        • Load Balancing
        • Reverse-proxy Caching
        • Web Hosting
        • Postfix
        • Updating System Packages
        • Fail2ban
        • Monitoring
        • Changes Philosophy
    • Customized Use
      • Common Customization Points
        • Plone Setup
        • Web Hosting Options
        • Mail Relay
        • Bypassing Components
        • Multiple Plones Per Host
        • The Plone Role – Using It Independently
    • Maintenance Strategies
      • Virtualenv
      • What Belongs To The playbook And What Doesn’t
      • Git Forks
      • Maintenance Strategies – Multiple Hosts
    • Plone Deployments With Amazon OpsWorks
      • Introduction
      • Deployment Terminology
        • Opsworks
        • Instance Lifecycle
      • Creating Your First Stack
        • Adding An Instance
        • Caveats
      • Deploying Changes
        • Instance Sizes
        • Scaling
        • Configuration
      • Maintenance
        • Backups
        • Updates
        • Monitoring
        • Sending Mail
        • SSH Access
      • What Doesn’t It Do
        • Storage Options
        • Proxy Cache Purging
        • Chef 12
    • About
    • Glossary
  • Plone Deployments With Amazon OpsWorks
    • Introduction
    • Deployment Terminology
      • Opsworks
      • Instance Lifecycle
    • Creating Your First Stack
      • Adding An Instance
      • Caveats
    • Deploying Changes
      • Instance Sizes
      • Scaling
      • Configuration
    • Maintenance
      • Backups
      • Updates
      • Monitoring
      • Sending Mail
      • SSH Access
    • What Doesn’t It Do
      • Storage Options
      • Proxy Cache Purging
      • Chef 12
  • “Through-The-Web” Plone Customization
    • Customizing logo and CSS of default theme
      • Customize Logo
      • Customize CSS/Less Variables
    • Configuring and Customizing Plone
      • The Control Panel
        • General
        • Content
        • Users
        • Security
        • Advanced
        • Change The Logo
        • Portlets
        • Viewlets
        • ZMI (Zope Management Interface)
        • Summary
    • Introduction to Diazo Theming
      • Installation
      • Two Approaches To Theming
      • What Is Diazo?
      • Principles
      • Copy Barceloneta Theme
      • Anatomy Of A Diazo Theme
        • Exercise 1 - Inspecting the manifest.cfg
      • <body> CSS Classes
        • <body> Classes For An Anonymous Visitor
        • <body> Classes For A Manager
      • Custom Rules
        • Conditionally Showing Content
      • Customize CSS
    • Creating a custom theme based on Barceloneta
      • Inheriting From Barceloneta
        • Exercise 1 - Create A New Theme That Inherits From Barceloneta
      • Viewing The Unthemed Plone Site
        • Exercise 2 - Viewing The Unthemed Site
      • Diazo Rule Directives And Attributes
        • CSS Selector Based Attributes
        • XPath Selector Based Attributes
        • Exercise 3 - The <drop> Directive
        • Conditional Attributes
      • Converting An Existing HTML Template Into A Theme
        • Exercise 4 - Convert A HTML Template Into A Diazo Theme
      • Create A Visitor-Only Theme - Conditionally Enabling Barceloneta
        • Exercise 5 - Convert The Theme To Be A Visitor-Only Theme
    • Dexterity
      • What Is A Content Type?
      • The Makings Of A Plone Content Type
      • Dexterity And Archetypes
      • Modifying Existing Types
      • Creating Content Types “Through-The-Web”
      • Moving Content Types Into Code
      • Exercises
        • Exercise 1
        • Exercise 2
    • Mosaic
      • What is Mosaic?
      • Some Comparisons
      • Installation
      • Principle
      • The Mosaic Editor
        • Exercise 1 - Change The Layout Of The Front Page
      • Change The Content Layout
      • Customize A Content Layout
      • The Tiles
        • Exercise 2: Customize The Home Page Layout
      • Create A Reusable Layout
        • Exercise 3: Create A Layout For Talks
      • Manage Custom Layouts
      • Edit The Layout HTML Structure
      • Import Layouts
    • Rapido
      • What is Rapido?
      • A couple of comparisons
      • Installation
      • Principles
      • How To Create A Rapido App
        • Blocks And Elements
        • Include Rapido Blocks In Plone Pages
        • Make Our Blocks Dynamic
        • Create Actions
        • Store Data
        • HTML Templating Vs TAL Templating
        • Create Custom Views
        • Index And Query Records
        • Create Custom Content-rules
        • Other Topics
    • Workflow
      • What Is Workflow?
      • Plone Comes With Several Workflows
      • You Can Add and Customize Workflows
      • Workflow Applies to Included and New Content Types
      • Example Business Process: Home Renovation Permits
        • The Paper-Based Business Process
        • The Online Business Process
      • What is a Workflow Application?
      • Why Use a Workflow Application?
      • A Simple Workflow Application: Submitting Questions
      • Tools for Building Workflow Applications
      • Use Dexterity to Build a Content Type and Form
      • About the Dexterity XML Field Model
      • Viewing the Dexterity Form
      • Create a Folder to Hold Filled Out Forms
      • Grant Access to the Folder
      • Test the Form to Create Content Items
        • Test the Form as a Manager
        • Test the Form as an Anonymous Website Visitor
      • Create a Thank You Page
        • Create a New View for the Question Content Type
        • Set the Default View for the Question Content Type
        • Test the New Default View
      • Add Replying to the New View
      • Design the Workflow
        • Workflow States and Transitions
        • Workflow Security
      • Create the Workflow
      • Create the Workflow States
        • Create the Initial Private State
        • Remove Any Unneeded States
        • Create the Replied State
      • Create the Workflow Transitions
      • Connect States Using Transitions
      • Assign the Workflow to the Question Content Type
      • Display Workflow State in the View
        • Test the View
        • Redirect to Homepage
      • Test the Workflow
        • Bonus Exercise
      • Put It All Together
        • Create a Collection
        • Change the Home Page
        • Bonus Exercise
      • Review
      • Further Reading
    • About
    • Glossary
  • Plone Training Solr
    • Setup
      • Solr Buildout
      • Plone And Solr
        • Control Panel Configuration
        • Configuration With ZCML
      • Committing Strategies
        • Synchronous Immediately
        • Synchronous Batched
        • Asynchronous
      • Exercise
    • Solr GUI And Query Syntax
      • Access Solr GUI
      • Solr Query Syntax
      • Solr Query Via URL
      • Solr Query Via API
      • Advanced Solr Query Syntax
      • Date math
      • Existing (And Non-existing) Queries
      • Faceting
      • Search GUIs
      • Exercise
    • First Steps
      • Maintenance Task
        • Reindex
        • Cleanup
        • Sync Solr Index
        • Purge Solr Index
      • Indexing A New Dexterity Field
      • Boosting
      • Exercise
    • How Does collective.solr Work
      • Base Functionality
      • Transactions
      • Querying Solr With collective.solr
      • Mangler
    • Solr Buildout Configuration
      • Solr Multi Core
      • Stopwords
      • Stemming
      • Synonyms
      • Exercise
    • More Features
      • Autocomplete
      • Suggest
      • Facetting
      • Excercise
    • Solr Testing
      • Exercise
    • Production Setup
      • Multi Core
      • Monitoring
      • Different host setup
      • Further reading
    • Alternative Indexing/Search Solutions
      • alm.solrindex
        • Setup
        • Why Are Results Missing?
        • Customization
      • DIY Solr
      • collective.elasticsearch
      • Google Custom Search
    • About
    • Glossary
  • Plone Workflow
    • Introduction To Workflows
      • What Is A Workflow?
      • What’s In a Workflow?
        • Workflows Control
        • States Control
        • Transitions Control
      • How Does Workflow Work In Plone?
      • Moving Content Through Workflows
    • Basic Roles and Permissions
      • Definitions
        • Roles
      • Giving Out Permissions
      • Permissions
        • Standard Permissions
    • Local Roles
      • Local Roles On Folders
      • Local Roles On Groups
        • Additional Resources
    • Dynamic Roles
      • Using Dynamic Roles
    • Placeful Workflow
      • Getting Started
      • Internals Of Placeful Workflow
    • Multi-chain Workflows
    • Workflow Variables
    • Using GenericSetup to Manage Plone Workflows
      • Getting Started
      • Exporting Workflow Policies
      • Importing Workflow Policies
    • About
    • Glossary
  • Angular SDK for Plone
    • Summary
    • What Is Angular
    • What Is The Plone Angular SDK
      • Traversing
      • A New Integration Approach For Plone
    • Installing The Development Environment
    • Initializing A New Project
    • Using And Customizing The Angular Plone Components
      • Preparing The Plone Backend
      • Adding The @plone/restapi-angular Dependency
      • Connecting The Project To The Plone Backend
    • Integrating A Theme
      • Integrate Bootstrap
    • Override A default Plone Component Template
      • Update The App Component Markup
    • Creating A Custom View For The Talk Content Type
      • Create The Talk Content Type In The Backend
      • Create A View Component For Talks
      • Enable Comments
    • Displaying News On The Home Page
    • Login
    • Adding Quick Links In the Footer
      • Customizing The Link Content Type
      • Displaying The Links
    • Deployment
    • Managing The Plone Configuration From The Angular Project
      • Creating A Theme To Handle The Configuration
      • Pushing The Plone Configuration From The Angular Project
    • Advanced
      • Moving Logic In A Service
      • Reactive Programming With RxJS
      • Enabling Offline & PWA
      • SEO And Server-side Rendering
    • About
    • Glossary
  • React
    • 1. Introduction
      • 1.1. Who are you?
      • 1.2. What will we do?
      • 1.3. What to expect
      • 1.4. Documentation
    • 2. Bootstrapping A React Project
      • 2.1. Installing dependencies
      • 2.2. Bootstrapping A Project
      • 2.3. Running The Project
    • 3. Create React Component
      • 3.1. Generated App Code
      • 3.2. Exercise
      • 3.3. Extra Information
    • 4. Styling Your Component
      • 4.1. Add stylesheet
      • 4.2. Exercise
    • 5. Convert To A Reusable Component
      • 5.1. Create A Reusable component
      • 5.2. Exercise
      • 5.3. Property Validation
    • 6. Use Snapshot Testing
    • 7. How To Use State In Your Component
      • 7.1. Store Questions And Answers In The State
      • 7.2. How to declare the state into functional Component
      • 7.3. Exercise
    • 8. Use Event Handlers
      • 8.1. Toggle Method
      • 8.2. Exercise
      • 8.3. Click Handler
    • 9. Use Callbacks To Delete An Item
      • 9.1. Add Delete Button
      • 9.2. Write The onDelete Handler
      • 9.3. Write A Dummy Delete Handler
      • 9.4. Delete The FAQ Item From The List
    • 10. Use Forms To Add An Item
      • 10.1. Add The Form
      • 10.2. Manage Field Values In The State
      • 10.3. Submit Handler
    • 11. Use Initial Form Data To Edit An Item
      • 11.1. Two Modes For The FAQ Item
      • 11.2. Wiring Everything Together
    • 12. Use Redux To Store Data
      • 12.1. Introduction
      • 12.2. Installing
      • 12.3. Actions
      • 12.4. Reducers
      • 12.5. Combine Multiple Reducers
    • 13. Write Tests For Your Reducers
      • 13.1. Reducer Tests
      • 13.2. Exercise
    • 14. Use Actions To Manipulate The Store
      • 14.1. Wiring The Store
      • 14.2. Use The Data From The Store
      • 14.3. Exercise
    • 15. Using External Data
      • 15.1. Creating A Simple Backend
      • 15.2. Writing Middleware
    • 16. Use Lifecycle Methods
    • 17. Using Different Routes
      • 17.1. Routing
      • 17.2. Writing The View
      • 17.3. Exercise
    • 18. Using Links To Navigate
    • 19. Navigate Using Redirects
    • 20. About
    • 21. Glossary
  • Volto
    • 1. Introduction
      • 1.1. Who are you?
      • 1.2. What will we do?
      • 1.3. What to expect
      • 1.4. Documentation
    • 2. Code Walkthrough
      • 2.1. Actions
      • 2.2. Components
      • 2.3. Config
      • 2.4. Constants
      • 2.5. Helpers
      • 2.6. Icons
      • 2.7. Middleware
      • 2.8. Reducers
      • 2.9. Theme
    • 3. Bootstrapping A Volto Project
      • 3.1. Installing Plone
      • 3.2. Installing Dependencies
      • 3.3. Bootstrapping A Project
      • 3.4. Running The Project
    • 4. Styling
      • 4.1. Semantic UI
      • 4.2. Changing Base Font
      • 4.3. Changing The Breadcrumbs
      • 4.4. Using Overrides
    • 5. Static Resources
      • 5.1. The Public Folder
      • 5.2. Exercise
    • 6. Override Components
      • 6.1. Override The Logo
      • 6.2. Exercise
      • 6.3. Change The Tags Component
    • 7. Internationalization
      • 7.1. Making Text Translatable
      • 7.2. Extracting i18n Strings
      • 7.3. Excercise
      • 7.4. Translate Attributes
      • 7.5. Exercise
    • 8. Override Views
      • 8.1. Exercise
    • 9. Custom Views
      • 9.1. Full View
      • 9.2. Registering The View
      • 9.3. Exercise
    • 10. Custom Widget
      • 10.1. Setup The Content Type
      • 10.2. Registering The Widget
      • 10.3. Exercise
    • 11. Rich Text Editor Settings
      • 11.1. Exercise
    • 12. Actions & Reducers
      • 12.1. Creating The Action
      • 12.2. Creating The Reducer
      • 12.3. Exercise
    • 13. About
    • 14. Glossary
  • Volto Hands-On
    • 1. Introduction
      • 1.1. Who are you?
      • 1.2. What will we do?
      • 1.3. What to expect
      • 1.4. The hands-on exercise
      • 1.5. Documentation
    • 2. Quick Start
      • 2.1. Using the hands on code repository
      • 2.2. Build environments
        • 2.2.1. Plone environment
        • 2.2.2. Install Volto dependencies
        • 2.2.3. Yarn environment
        • 2.2.4. Executing environments
      • 2.3. Volto source code
      • 2.4. Recommended plugins
    • 3. Project requirements
      • 3.1. Tasks
    • 4. Theming
      • 4.1. Basic font family
      • 4.2. custom.overrides
    • 5. Header
      • 5.1. Header styling
      • 5.2. Logo
      • 5.3. Header component
      • 5.4. Component shadowing
    • 6. Footer
    • 7. Breadcrumbs
      • 7.1. Hiding them from the App first level component
    • 8. Blocks
      • 8.1. Brief introduction to Volto blocks
      • 8.2. How to manually enable Blocks on a content type
      • 8.3. Blocks anatomy
        • 8.3.1. Block view component props
        • 8.3.2. Block edit component props
        • 8.3.3. Blocks settings
    • 9. Blocks - Main Slider
      • 9.1. Install react-slick
      • 9.2. Add library styles
      • 9.3. Block view component
      • 9.4. Styling
      • 9.5. Remove the Title block
    • 10. Content types Views
      • 10.1. Success Story
      • 10.2. Creating a view for a custom content type
      • 10.3. Completing the new view
    • 11. Blocks - Highlights
      • 11.1. Basics
      • 11.2. Structure and styling
      • 11.3. Recent launches behavior
    • 12. Blocks - Edit components
      • 12.1. Sidebar
      • 12.2. Object Browser
      • 12.3. Teaser block
        • 12.3.1. Teaser block edit component
    • 13. About
    • 14. Glossary
  • Volto Add-ons Development
    • 1. Introduction
      • 1.1. Who are you?
      • 1.2. What will we do?
      • 1.3. What to expect
        • 1.3.1. Roadmap
      • 1.4. The hands-on exercise
      • 1.5. Before you start
    • 2. Volto add-ons development
      • 2.1. Volto: an overview
      • 2.2. Bootstrap a new Volto project
      • 2.3. Addons - first look
      • 2.4. Bootstrap an add-on
      • 2.5. Create a new block
        • 2.5.1. Improve the block edit
    • 3. Basic working block
    • 4. Improve the block view
      • 4.1. The React HOC Pattern
    • 5. Block editing with a form
      • 5.1. Initial block data as a reusable pattern
    • 6. Customizable columns
      • 6.1. Write a new Volto widget
    • 7. Make the block extendible
      • 7.1. Making use of our new renderers
        • 7.1.1. Renderer within the edit component
        • 7.1.2. Renderer within the view component
    • 8. Add-ons - advanced topics
      • 8.1. Q&A
      • 8.2. Bundle optimization
    • 9. Plone integration with Volto blocks
      • 9.1. Block transformations
      • 9.2. Smart fields
      • 9.3. Searchable text from blocks
    • 10. About
    • 11. Glossary
    • 12. Developer integration with text editors
    • 13. Really short primer on Javascript enhancements
      • 13.1. Destructuring
      • 13.2. Spread
      • 13.3. Arrow functions
  • Migrating Content with Transmogrifier
    • Export Current Site Content
      • Export from Plone
      • Export from Wordpress
      • Write Your Own Export
    • Transmogrifier Basics
      • Transmogrifier Setup and Terminology
      • Add-ons
      • Create a Migration Package
    • Before Running the Import
    • Writing the Import Pipeline
      • Terminology
      • Pipeline Details
      • Other Included Pipeline Steps
      • New Pipeline Step
    • Writing Custom Blueprints
      • Basic Blueprint Tips
      • Practice
    • Running the Import
      • How to Run the Import
      • Common Errors
      • Debugging Other Errors
      • Running the import multiple times
      • Writing tests
    • Advanced Pipeline Tips
      • Multiple pipelines
      • Dates Updater
      • Conditions
      • Changing Types
      • Others
    • Advanced Blueprint Tips
      • Iterator Stages
      • Migrating Users & Groups
      • Updating Rich Text
      • Taking parameters in custom blueprints
    • Glossary
    • Users & Groups Migration
  • How to build your own webframework from scratch
    • About this course
    • The Web and Python
      • WSGI
    • Hello WSGI
      • Running a WSGI application
        • Exercise 1
    • Middlewares
      • A Simple WSGI Middleware
        • Exercise 2
        • Exercise 3
    • Routing
      • Using PATH_INFO
        • Exercise 4
      • Working with URL parameters
        • Exercise 5
    • From Raw WSGI to a framework
    • Exploiting Python’s data model
      • A Dictionary like Session storage
      • Requests read only attributes
      • Quick access to properties
      • Ability to extend
    • Metaclasses
    • Functional Python
    • Summary
  • Indices and tables
  • GatsbyJS
    • Summary
    • What Is GatsbyJS
    • How it works
      • 1) Fetch data
      • 2) Build
      • 3) Deploy
    • Installing The Development Environment
    • Creating a new GatsbyJS site
    • Pages
      • Exercise
        • Components
      • Exercise
    • Data
      • GraphQL
      • Site metadata
    • Source plugins
      • Exercise
    • Transformer plugins
      • Exercise
    • Dynamic pages
    • Building Source Plugins
      • Comparing Plone Site and GatsbyJS Site
      • How It Works
      • GatsbyJS Node
        • Exercise
    • Fetching Data Using Plone REST.API
      • Exploring The Plone REST.API
        • Exercise
    • Search Traversal Method Of Retrieving Data
      • Getting The Full List Of Content
        • Exercise
    • gatsby-source-plone
      • Configuration
      • Exercise
    • gatsby-starter-plone
    • Copying The Plone Site
      • Page Creation
      • Handling Different Data Types
    • RichText Component
      • Images And Files
      • RichText Component
        • Exercise
    • Navigation
      • Breadcrumbs
      • Navigation
    • About
    • Glossary
  • Testing Plone
    • Summary
    • Intro to tests
      • What is a test?
      • Why do we test?
      • Apparent issues with tests
      • Benefits of tests
    • Some theory
      • Test types
    • How to test a Plone add-on
      • Create Package
      • Buildout
    • Testing setup
      • Test runner
      • Testing setup
      • Setup and teardown hooks
      • Tests
      • Assertions
    • Unit tests
      • Create our first unit test
        • Exercise 1
        • Exercise 2
    • Testing a Dexterity content type
      • Create a new content type
      • Test the content type
        • Exercise 1
      • Functional test
    • Testing a view
      • Create a new view
      • Test the view
        • Exercise 1
        • Exercise 2
    • Acceptance testing
    • Robot tests
      • Robot test file format
      • Test scenarios
      • Running robot tests
      • Debugging robot tests
      • Test reports
        • Exercise 1
        • Exercise 2
        • Exercise 3
    • Continuous Integration
      • Travis CI
        • Excercise
      • GitLab
      • tox
        • Excercise
    • About
    • Glossary
  • Deploying and Operating Plone on WSGI
    • 1. Setup a box for the training
      • 1.1. Installing Prerequisites
      • 1.2. Creating a Virtualenv for the Training
    • 2. PEP 3333
    • 3. Deploying Plone with WSGI using zc.buildout, plone.recipe.zope2instance and Waitress
    • 4. Differences to the ZServer setup
    • 5. Understanding the contents of wsgi.ini
      • 5.1. The WSGI pipeline
    • 6. What’s left in zope.conf?
      • 6.1. Exercises
        • 6.1.1. Exercise 1
        • 6.1.2. Exercise 2
    • 7. WSGI options
      • 7.1. http-address
      • 7.2. threads
      • 7.3. wsgi
      • 7.4. wsgi-ini-template
      • 7.5. debug-exceptions
      • 7.6. access-log, z2-log
      • 7.7. access-log-level, z2-log-level
      • 7.8. Advanced logging for WSGI
        • 7.8.1. Exercise 1
      • 7.9. sentry* options
      • 7.10. Options that are currently unavailable for WSGI
    • 8. Bjoern
      • 8.1. Prerequisites
      • 8.2. Use bjoern in our buildout
        • 8.2.1. Exercise 1
    • 9. Gunicorn
      • 9.1. Possible Worker models
      • 9.2. Use gunicorn in our buildout
      • 9.3. Alternative method for using gunicorn
        • 9.3.1. Exercise 1
    • 10. uWSGI
      • 10.1. Possible Worker models
      • 10.2. Using uWSGI in our buildout
        • 10.2.1. Exercise 1
      • 10.3. Using uWSGI Emperor from the distribution
        • 10.3.1. Exercise 2
    • 11. Debugging Plone on WSGI
      • 11.1. Debugging with waitress
      • 11.2. werkzeug debugging
      • 11.3. Debugging uWSGI
    • 12. Useful Add-ons and Utilities
      • 12.1. Sentry
      • 12.2. haufe.requestmonitoring
    • 13. Can I talk to the supervisor?
      • 13.1. Install Plone using pip
      • 13.2. Protocols other than HTTP (FTP, WebDAV, …)

Plone Trainings

  • About
  • Glossary
  • Teachers Training
    • How To Give Technical Training(s)
      • 1. Training theory: education, how people learn and process information
        • Introduction
        • Learning Styles and the Trainer
        • Try to teach one thing at a time
        • Attention Span
        • The more you know, the less you know
      • 2. Before the training: Create material, invite trainees, preparation
        • Who do you want to give a training to
        • Training information
        • Show it all or practice the basics
        • Group size, number of trainers
        • Contact your students before the training
        • Re-use and improve the material that is already available
        • Verify the training location and facilities
        • Prepare for the worst
      • 3. During training day(s): what to expect, do’s and don’ts
        • Structure of your training day
      • 4. After the training: Aftercare, keep in touch, learn, improve
Plone Training
  • »
  • How to build your own webframework from scratch

How to build your own webframework from scratch¶

Contents:

  • About this course
  • The Web and Python
    • WSGI
  • Hello WSGI
    • Running a WSGI application
  • Middlewares
    • A Simple WSGI Middleware
  • Routing
    • Using PATH_INFO
    • Working with URL parameters
  • From Raw WSGI to a framework
  • Exploiting Python’s data model
    • A Dictionary like Session storage
    • Requests read only attributes
    • Quick access to properties
    • Ability to extend
  • Metaclasses
  • Functional Python
  • Summary

Indices and tables¶

  • Index

  • Module Index

  • Search Page

Next Previous

© Copyright The text and illustrations in this website are licensed by the Plone Foundation under a Creative Commons Attribution 4.0 International license..

Built with Sphinx using a theme provided by Read the Docs.