+ All Categories
Home > Engineering > All you need is...Mezzanine!

All you need is...Mezzanine!

Date post: 19-Aug-2014
Category:
Upload: comune-di-zola-predosa
View: 119 times
Download: 1 times
Share this document with a friend
Description:
Slides of talk by Simone Dalla on Mezzanine at Pycon 5, Florence, Italy, May 2014. Mezzanine is an open source content management platform built using Django Framework.
Popular Tags:
26
PyCon 5 - Florence, May 24, 2014 All you need is… ...Mezzanine!
Transcript
Page 1: All you need is...Mezzanine!

PyCon 5 - Florence, May 24, 2014

All you need is…

...Mezzanine!

Page 2: All you need is...Mezzanine!

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!

Page 3: All you need is...Mezzanine!

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 publishinto official government web

site

Page 4: All you need is...Mezzanine!

OpenPa by Mezzaninehttps://www2.comune.zolapredosa.bo.it

Page 5: All you need is...Mezzanine!

http://mezzanine.jupo.org/

Page 6: All you need is...Mezzanine!

http://mezzanine.jupo.org/

Page 7: All you need is...Mezzanine!

http://mezzanine.jupo.org/

Batteries Included

Page 8: All you need is...Mezzanine!

http://mezzanine.jupo.org/

Batteries Included

Page 9: All you need is...Mezzanine!

- Ecommerce: cartridge.jupo.org - Forum: drum.jupo.org- Themes: mezzathe.me

~ 70 Packages: https://www.djangopackages.com/grids/g/mezzanine/

EXTRA Batteries Included

Page 10: All you need is...Mezzanine!

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

Page 11: All you need is...Mezzanine!

Et voilà...

Page 12: All you need is...Mezzanine!

User

Page 13: All you need is...Mezzanine!

User (backoffice)

Page 14: All you need is...Mezzanine!

User (backoffice)

Page 15: All you need is...Mezzanine!

http://blog.jupo.org/2014/04/19/mezzanine-3.1-for-workgroups/

Growth of Mezzanine has been consistent

Page 16: All you need is...Mezzanine!

Developer... “and now???”

Page 17: All you need is...Mezzanine!

“Mantra for working with Mezzanine:

Mezzanine is Just Django”

Ken Bolton, long-time Mezzanine contributor.

Page 18: All you need is...Mezzanine!

Creating Custom Content Types

from django.db import modelsfrom 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

Page 19: All you need is...Mezzanine!

Admin Custom Content Typesfrom copy import deepcopyfrom django.contrib import adminfrom mezzanine.core.admin import (

TabularDynamicInlineAdmin)from mezzanine.pages.admin import PageAdminfrom .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

Page 20: All you need is...Mezzanine!

Displaying Custom Content Types>>> Poll.objects.create(title="What's your favourite program language?", pub_date=now())<Poll: What's your favourite program language?>>>> page = Page.objects.create(title="What's your favourite program language?")>>> page<Page: What's your favourite program language?>>>> page.poll<Poll: What's your favourite program language?>>>> page.get_content_model()<Poll: What’s your favourite program language>

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 }} <p>Published at {{ page.poll.pub_date }}</p> <ul> {% for choice in page.poll.choice_set.all %} <li>{% editable choice.choice_text %}{{ choice.choice_text }}{% endeditable %} n. votes: {{ choice.votes }}</li> {% endfor %} </ul>{% endblock %}

polls/templates/poll.py

Page 21: All you need is...Mezzanine!

Page Processor

http://mezzanine.jupo.org/docs/content-architecture.html#page-processors

from django.shortcuts import get_object_or_404from mezzanine.pages.page_processors import processor_forfrom .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."}

<h2>Vote!!!</h2>{% if error_message %}<div class="alert alert-danger">{{ error_message }}</div>{% endif %}{% if success_message %}<div class="alert alert-success">{{ success_message }}</div>{% endif %}<form action="." method="post">{% csrf_token %}{% for choice in page.poll.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /> <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />{% endfor %}<input type="submit" value="Vote" /></form>

polls/page_processors.py

polls/templates/poll.py

Page 22: All you need is...Mezzanine!

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.

Page 23: All you need is...Mezzanine!

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.

Page 24: All you need is...Mezzanine!
Page 26: All you need is...Mezzanine!

Thank you! ….questions?

Talk Mezzanine Project codehttps://github.com/simodalla/mezzanine_talk_polls


Recommended