Skip to content
This repository has been archived by the owner on Sep 5, 2019. It is now read-only.

Commit

Permalink
Adds the ability to add people to pages
Browse files Browse the repository at this point in the history
  • Loading branch information
Denis Krienbühl committed Jul 6, 2015
1 parent 700ed04 commit 6c0392b
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 19 deletions.
11 changes: 7 additions & 4 deletions onegov/town/locale/de/LC_MESSAGES/onegov.town.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2015-07-03 13:55+0200\n"
"POT-Creation-Date: 2015-07-06 15:49+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: Fabian Reinhard <fabian.reinhard@seantis.ch>\n"
"Language-Team: \n"
Expand Down Expand Up @@ -113,9 +113,6 @@ msgstr "Titel"
msgid "URL"
msgstr "URL"

msgid "Hide from the public"
msgstr "Vor der Öffentlichkeit verstecken"

msgid "Lead"
msgstr "Einleitung"

Expand All @@ -125,6 +122,12 @@ msgstr "Beschreibt kurz um was es bei diesem Thema geht"
msgid "Text"
msgstr "Text"

msgid "Hide from the public"
msgstr "Vor der Öffentlichkeit verstecken"

msgid "Function"
msgstr "Funktion"

msgid "Link"
msgstr "Verknüpfung"

Expand Down
77 changes: 70 additions & 7 deletions onegov/town/models/page.py
@@ -1,6 +1,8 @@
from onegov.core import utils
from onegov.core.utils import sanitize_html
from onegov.form import Form, with_options
from onegov.form.parser.core import WTFormsClassBuilder, FieldDependency
from onegov.people import Person, PersonCollection
from onegov.page import Page
from onegov.town import _
from onegov.town.models.traitinfo import TraitInfo
Expand Down Expand Up @@ -38,12 +40,71 @@ def allowed_subtraits(self):
def is_supported_trait(self, trait):
return trait in {'link', 'page'}

def get_form_class(self, trait):
def with_people(self, form_class, request):

assert hasattr(form_class, 'get_page')
assert hasattr(form_class, 'set_page')

class PeoplePageForm(form_class):

def get_people_fields(self):
return {
f: self._fields[f] for f in self._fields
if f.startswith('people_') and not f.endswith('_function')
}

def get_page(self, page):
super(PeoplePageForm, self).get_page(page)

fields = self.get_people_fields()

ids = {f: v for f, v in fields.items() if v.data is True}

page.content['people'] = [
[v.id.hex, self._fields[f + '_function'].data]
for f, v in ids.items()
]

def set_page(self, page):
super(PeoplePageForm, self).set_page(page)

fields = self.get_people_fields()
people = dict(page.content.get('people', []))

for field_id, field in fields.items():
if field.id.hex in people:
self._fields[field_id].data = True
self._fields[field_id + '_function'].data\
= people[field.id.hex]

builder = WTFormsClassBuilder(PeoplePageForm)
builder.set_current_fieldset(_("People"))

query = PersonCollection(request.app.session()).query()
query = query.order_by(Person.first_name, Person.last_name)

for person in query.all():
field_id = builder.add_field(
field_class=BooleanField,
label=person.title,
required=False,
id=person.id
)
builder.add_field(
field_class=StringField,
label=_("Function"),
required=False,
dependency=FieldDependency(field_id, 'y')
)

return builder.form_class

def get_form_class(self, trait, request):
if trait == 'link':
return LinkForm

if trait == 'page':
return PageForm
return self.with_people(PageForm, request)

raise NotImplementedError

Expand Down Expand Up @@ -74,7 +135,7 @@ def allowed_subtraits(self):
def is_supported_trait(self, trait):
return trait in {'news'}

def get_form_class(self, trait):
def get_form_class(self, trait, request):
if trait == 'news':
return PageForm

Expand All @@ -91,12 +152,12 @@ def news_query(self):
return query


class PageForm(Form):
class PageBaseForm(Form):
""" Defines the base form for all pages. """
title = StringField(_("Title"), [validators.InputRequired()])


class LinkForm(PageForm):
class LinkForm(PageBaseForm):
""" Defines the form for pages with the 'link' trait. """
url = URLField(_("URL"), [validators.InputRequired()])

Expand All @@ -111,7 +172,7 @@ def set_page(self, page):
self.url.data = page.content.get('url')


class PageForm(PageForm):
class PageForm(PageBaseForm):
""" Defines the form for pages with the 'page' trait. """
lead = TextAreaField(
label=_("Lead"),
Expand All @@ -123,7 +184,9 @@ class PageForm(PageForm):
widget=with_options(TextArea, class_='editor'),
filters=[sanitize_html, mark_images])

is_hidden_from_public = BooleanField(_("Hide from the public"))
is_hidden_from_public = BooleanField(
label=_("Hide from the public")
)

def get_page(self, page):
""" Stores the form values on the page. """
Expand Down
14 changes: 11 additions & 3 deletions onegov/town/templates/macros.pt
Expand Up @@ -95,9 +95,17 @@
</tal:block>
<tal:block condition="input_type != 'hidden'">
<label tal:attributes="class field.errors and 'error' or None">
<span class="label-text">${field.label.text}</span>
<span class="label-required" tal:condition="field.flags.required|nothing">*</span>
${field(placeholder=request.translate(field.description))}
<!-- render the label after the field if it's a boolean field -->
<tal:block condition="field.type == 'BooleanField'">
${field(placeholder=request.translate(field.description))}
<span class="label-text">${field.label.text}</span>
<span class="label-required" tal:condition="field.flags.required|nothing">*</span>
</tal:block>
<tal:block condition="field.type != 'BooleanField'">
<span class="label-text">${field.label.text}</span>
<span class="label-required" tal:condition="field.flags.required|nothing">*</span>
${field(placeholder=request.translate(field.description))}
</tal:block>
</label>
<small class="error" tal:repeat="error field.errors">${error}</small>
</tal:block>
Expand Down
37 changes: 37 additions & 0 deletions onegov/town/tests/test_views.py
Expand Up @@ -699,3 +699,40 @@ def test_people_view(town_app):

people = client.get('/personen')
assert 'noch keine Personen' in people


def test_with_people(town_app):
client = Client(town_app)

login_page = client.get('/login')
login_page.form.set('email', 'editor@example.org')
login_page.form.set('password', 'hunter2')
login_page.form.submit()

people = client.get('/personen')

new_person = people.click('Person')
new_person.form['first_name'] = 'Flash'
new_person.form['last_name'] = 'Gordon'
new_person.form.submit()

new_person = people.click('Person')
new_person.form['first_name'] = 'Merciless'
new_person.form['last_name'] = 'Ming'
new_person.form.submit()

new_page = client.get('/themen/leben-wohnen').click('Thema')

assert 'Flash Gordon' in new_page
assert 'Merciless Ming' in new_page

new_page.form['title'] = 'About Flash'
new_page.form['people_flash_gordon'] = True
new_page.form['people_flash_gordon_function'] = 'Astronaut'
edit_page = new_page.form.submit().follow().click('Bearbeiten')

assert edit_page.form['people_flash_gordon'].value == 'y'
assert edit_page.form['people_flash_gordon_function'].value == 'Astronaut'

assert edit_page.form['people_merciless_ming'].value is None
assert edit_page.form['people_merciless_ming_function'].value == ''
8 changes: 6 additions & 2 deletions onegov/town/views/editor.py
Expand Up @@ -10,8 +10,12 @@
from onegov.town.models import Editor


@TownApp.form(model=Editor, form=lambda e: e.page.get_form_class(e.trait),
template='form.pt', permission=Private)
def get_form_class(editor, request):
return editor.page.get_form_class(editor.trait, request)


@TownApp.form(model=Editor, template='form.pt', permission=Private,
form=get_form_class)
def handle_page_form(self, request, form):
if self.action == 'new':
return handle_new_page(self, request, form)
Expand Down
3 changes: 2 additions & 1 deletion onegov/town/views/form_definition.py
Expand Up @@ -116,7 +116,8 @@ def handle_new_definition(self, request, form):


@TownApp.form(model=FormDefinition, template='form.pt', permission=Private,
form=lambda m: form_classes[m.type], name='bearbeiten')
form=lambda self, request: form_classes[self.type],
name='bearbeiten')
def handle_edit_definition(self, request, form):

if form.submitted(request):
Expand Down
2 changes: 1 addition & 1 deletion onegov/town/views/form_submission.py
Expand Up @@ -16,7 +16,7 @@
from onegov.town.layout import FormSubmissionLayout


@TownApp.form(model=FormDefinition, form=lambda e: e.form_class,
@TownApp.form(model=FormDefinition, form=lambda self, request: self.form_class,
template='form.pt', permission=Public)
def handle_defined_form(self, request, form):
""" Renders the empty form and takes input, even if it's not valid, stores
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -39,7 +39,7 @@ def get_long_description():
'jsmin',
'lazy-object-proxy',
'lxml',
'onegov.core>=0.4.5',
'onegov.core>=0.4.6',
'onegov.form>=0.6.3',
'onegov.foundation',
'onegov.people>=0.0.1',
Expand Down

0 comments on commit 6c0392b

Please sign in to comment.