Slide 1

Slide 1 text

PyCon 5 - Florence, May 24, 2014 All you need is… ...Mezzanine!

Slide 2

Slide 2 text

Simone Dalla @simodalla CI[T]O of Comune di Zola Predosa (Bologna, IT) Pythonista and Django programmer. I use Python into my work environment for..... ALL!

Slide 3

Slide 3 text

Problem Respect of Italy’s decree-law: “Amministrazione Trasparente, Pubblicazioni ai sensi del Decreto Legislativo 14 marzo 2013, n. 33. Riordino della disciplina riguardante gli obblighi di pubblicità, trasparenza e diffusione di informazioni da parte delle pubbliche amministrazioni. (GU n.80 del 5-4-2013)” ≃ 250 obligation to publish into official government web site

Slide 4

Slide 4 text

OpenPa by Mezzanine https://www2.comune.zolapredosa.bo.it

Slide 5

Slide 5 text

http://mezzanine.jupo.org/

Slide 6

Slide 6 text

http://mezzanine.jupo.org/

Slide 7

Slide 7 text

http://mezzanine.jupo.org/ Batteries Included

Slide 8

Slide 8 text

http://mezzanine.jupo.org/ Batteries Included

Slide 9

Slide 9 text

- Ecommerce: cartridge.jupo.org - Forum: drum.jupo.org - Themes: mezzathe.me ~ 70 Packages: https://www.djangopackages. com/grids/g/mezzanine/ EXTRA Batteries Included

Slide 10

Slide 10 text

Bootstrap (into an virtualenv) # Install from Pypi (venv)$ pip install mezzanine [south django-debug-toolbar] # Create a project (venv)$ mezzanine-project mysite (venv)$ cd mysite # Create a database (venv)$ python manage.py createdb # Apply default migrations (venv)$ python manage.py migrate # Run the webserver (venv)$ python manage.py runserver

Slide 11

Slide 11 text

Et voilà...

Slide 12

Slide 12 text

User

Slide 13

Slide 13 text

User (backoffice)

Slide 14

Slide 14 text

User (backoffice)

Slide 15

Slide 15 text

http://blog.jupo.org/2014/04/19/mezzanine-3.1-for-workgroups/ Growth of Mezzanine has been consistent

Slide 16

Slide 16 text

Developer... “and now???”

Slide 17

Slide 17 text

“Mantra for working with Mezzanine: Mezzanine is Just Django” Ken Bolton, long-time Mezzanine contributor.

Slide 18

Slide 18 text

Creating Custom Content Types from django.db import models from mezzanine.pages.models import Page # The members of Page will be inherited by the Poll # model, such as title, slug, etc. For polls we can use # the title field to store the poll’s question. For our # model definition, we just add any extra fields that # aren't part of the Page model, in this case, date of # publication. class Poll(Page): # question = models.CharField(max_length=200) pub_date = models.DateTimeField("Date published") class Choice(models.Model): poll = models.ForeignKey(Poll) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) https://docs.djangoproject.com/en/1. 6/intro/tutorial01/#creating-models http://mezzanine.jupo.org/docs/content-architecture. html#creating-custom-content-types (venv)$ python manage.py startapp polls polls/models.py

Slide 19

Slide 19 text

Admin Custom Content Types from copy import deepcopy from django.contrib import admin from mezzanine.core.admin import ( TabularDynamicInlineAdmin) from mezzanine.pages.admin import PageAdmin from .models import Poll, Choice poll_extra_fieldsets = ( (None, {"fields": ("pub_date",)}),) class ChoiceInline(TabularDynamicInlineAdmin): model = Choice class PollAdmin(PageAdmin): inlines = (ChoiceInline,) fieldsets = (deepcopy(PageAdmin.fieldsets) + poll_extra_fieldsets) admin.site.register(Poll, PollAdmin) https://docs.djangoproject.com/en/1. 6/intro/tutorial02/#adding-related-objects http://mezzanine.jupo.org/docs/content-architecture. html#creating-custom-content-types polls/admin.py

Slide 20

Slide 20 text

Displaying Custom Content Types >>> Poll.objects.create(title="What's your favourite program language?", pub_date=now()) >>> page = Page.objects.create(title="What's your favourite program language?") >>> page >>> page.poll >>> page.get_content_model() http://mezzanine.jupo.org/docs/content-architecture.html#displaying-custom-content-types {% extends "pages/page.html" %} {% load mezzanine_tags %} {% block title %} {% editable page.poll.title %}{{ page.poll.title }}{% endeditable %} {% endblock %} {% block main %} {{ block.super }}

Published at {{ page.poll.pub_date }}

    {% for choice in page.poll.choice_set.all %}
  • {% editable choice.choice_text %}{{ choice.choice_text }}{% endeditable %} n. votes: {{ choice.votes }}
  • {% endfor %}
{% endblock %} polls/templates/poll.py

Slide 21

Slide 21 text

Page Processor http://mezzanine.jupo.org/docs/content-architecture.html#page-processors from django.shortcuts import get_object_or_404 from mezzanine.pages.page_processors import processor_for from .models import Poll, Choice @processor_for(Poll) def author_form(request, page): if request.method == "POST": p = get_object_or_404(Poll, pk=page.poll.id) try: selected_choice = p.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return {'error_message': "You didn't select a choice."} else: selected_choice.votes += 1 selected_choice.save() return {'success_message': "Thank you for your vote."}

Vote!!!

{% if error_message %}
{{ error_message }}
{% endif %} {% if success_message %}
{{ success_message }}
{% endif %} {% csrf_token %} {% for choice in page.poll.choice_set.all %} {{ choice.choice_text }}
{% endfor %} polls/page_processors.py polls/templates/poll.py

Slide 22

Slide 22 text

Integrating Third-party Apps http://mezzanine.jupo.org/docs/content-architecture.html#integrating-third-party-apps-with-pages # MEZZANINE'S URLS # ---------------- # ADD YOUR OWN URLPATTERNS *ABOVE* THE LINE BELOW. ``mezzanine.urls`` INCLUDES # A *CATCH ALL* PATTERN FOR PAGES, SO URLPATTERNS ADDED BELOW ``mezzanine. urls`` # WILL NEVER BE MATCHED! url(r'^dj_polls/', include('dj_polls.urls', namespace='polls')), # If you'd like more granular control over the patterns in ``mezzanine.urls``, go right ahead # and take the parts you want from it, and use them directly below instead of using # ``mezzanine.urls``. ("^", include("mezzanine.urls")), Our “regoular third-party” Django app to integrate. Polls apps of official Django tutorial named here “dj_polls”. https://docs.djangoproject.com/en/1.6/intro/tutorial01/ Polls “Mezzanine” app developed earlier for custom types.

Slide 23

Slide 23 text

Integrating Third-party Apps http://mezzanine.jupo.org/docs/content-architecture.html#integrating-third-party-apps-with-pages Other requirement is pages in Mezzanine’s navigation to point to the urlpatterns for these regular Django apps. Implementing this simply requires creating a page (RichTextPage, Link..) in the admin, with a URL matching a pattern used by the application.

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

More information? Need help? Documentation http://mezzanine.jupo.org/ @stephen_mcd PyCon APAC keynote Source Code https://github.com/stephenmcd/mezzanine Mailing list https://groups.google.com/forum/#! forum/mezzanine-users Issues tracker https://github.com/stephenmcd/mezzanine/issues

Slide 26

Slide 26 text

Thank you! ….questions? Talk Mezzanine Project code https://github.com/simodalla/mezzanine_talk_polls