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

Commit

Permalink
Adds additional membership attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
msom committed Nov 13, 2018
1 parent 40bf15f commit 4ccd00b
Show file tree
Hide file tree
Showing 18 changed files with 220 additions and 44 deletions.
17 changes: 9 additions & 8 deletions onegov/agency/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
from io import BytesIO
from onegov.agency.collections import ExtendedAgencyCollection
from onegov.agency.collections import ExtendedPersonCollection
from onegov.agency.models import ExtendedAgencyMembership
from onegov.agency.pdf import DefaultAgencyPdf
from onegov.core.cli import command_group
from onegov.core.cli import pass_group_context
from onegov.core.html import html_to_text
from onegov.people.collections import AgencyCollection
from onegov.people.collections import PersonCollection
from onegov.people.models import AgencyMembership
from requests import get
from textwrap import indent
from xlrd import open_workbook
Expand Down Expand Up @@ -51,11 +51,11 @@ def _import(request, app):
'occupation': 'person.profession',
'phone': 'person.phone',
'political_party': 'person.political_party',
'postfix': 'membership.addition',
'role': 'membership.title',
'start': 'membership.since',
'title': 'person.title',
'year': 'person.born',
'postfix': '??' # todo:
}

class LinkFilter(Filter):
Expand Down Expand Up @@ -195,18 +195,19 @@ def defrag_ordering(agency):
for membership in memberships:
if membership:
values = re.match(
r'^\((\d*)\)\((.*)\)\((.*)\)\((.*)\)\((\d*)\)$',
r'^\((\d*)\)\((.*)\)\((.*)\)\((.*)\)'
r'\((.*)\)\((.*)\)\((\d*)\)$',
membership
).groups()
person.memberships.append(
AgencyMembership(
ExtendedAgencyMembership(
agency_id=ids[int(values[0])],
title=values[1] or "",
since=values[2] or None,
order=int(values[4]),
meta={
'prefix': values[3],
}
prefix=values[3],
addition=values[4],
note=values[5],
order=int(values[6]),
)
)

Expand Down
2 changes: 0 additions & 2 deletions onegov/agency/forms/agency.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,6 @@ class ExtendedAgencyForm(Form):

# todo: hide from public?

# todo: coordinates?

def get_useful_data(self):
exclude = {'csrf_token', 'organigram'}
result = super(ExtendedAgencyForm, self).get_useful_data(exclude)
Expand Down
12 changes: 12 additions & 0 deletions onegov/agency/forms/membership.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@ class MembershipForm(Form):
label=_("Since"),
)

note = StringField(
label=_("Note"),
)

addition = StringField(
label=_("Addition"),
)

prefix = StringField(
label=_("Prefix"),
)

def on_request(self):
self.request.include('common')
self.request.include('chosen')
Expand Down
13 changes: 11 additions & 2 deletions onegov/agency/locale/de_CH/LC_MESSAGES/onegov.agency.po
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2018-11-12 15:06+0100\n"
"PO-Revision-Date: 2018-11-12 15:05+0100\n"
"POT-Creation-Date: 2018-11-13 08:39+0100\n"
"PO-Revision-Date: 2018-11-13 08:40+0100\n"
"Last-Translator: Marc Sommerhalder <marc.sommerhalder@seantis.ch>\n"
"Language-Team: German\n"
"Language: de_CH\n"
Expand Down Expand Up @@ -133,6 +133,15 @@ msgstr "Bemerkungen"
msgid "Memberships"
msgstr "Mitgliedschaften"

msgid "Prefix"
msgstr "Präfix"

msgid "Addition"
msgstr "Zusatz"

msgid "Note"
msgstr "Notiz"

msgid "Homepage"
msgstr "Startseite"

Expand Down
2 changes: 2 additions & 0 deletions onegov/agency/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from onegov.agency.models.agency import AgencyPdf
from onegov.agency.models.agency import AgencyProxy
from onegov.agency.models.agency import ExtendedAgency
from onegov.agency.models.membership import ExtendedAgencyMembership
from onegov.agency.models.person import ExtendedPerson

__all__ = (
'AgencyPdf',
'AgencyProxy',
'ExtendedAgency',
'ExtendedAgencyMembership',
'ExtendedPerson',
)
21 changes: 21 additions & 0 deletions onegov/agency/models/agency.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from onegov.agency.models.membership import ExtendedAgencyMembership
from onegov.core.crypto import random_token
from onegov.core.orm.abstract import associated
from onegov.core.orm.mixins import meta_property
Expand All @@ -9,10 +10,13 @@


class AgencyPdf(File):
""" A PDF containing all data of an agency and its suborganizations. """

__mapper_args__ = {'polymorphic_identity': 'agency_pdf'}


class ExtendedAgency(Agency):
""" An extended version of the standard agency from onegov.people. """

__mapper_args__ = {'polymorphic_identity': 'extended'}

Expand Down Expand Up @@ -71,6 +75,23 @@ def proxy(self):

return AgencyProxy(self)

def add_person(self, person_id, title, **kwargs):
""" Appends a person to the agency with the given title. """

order = kwargs.pop('order', 2 ** 16)

self.memberships.append(
ExtendedAgencyMembership(
person_id=person_id,
title=title,
order=order,
**kwargs
)
)

for order, membership in enumerate(self.memberships):
membership.order = order


class AgencyProxy(object):
""" A proxy/alias for an agency.
Expand Down
19 changes: 19 additions & 0 deletions onegov/agency/models/membership.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from onegov.people import AgencyMembership
from onegov.core.orm.mixins import meta_property


class ExtendedAgencyMembership(AgencyMembership):
""" An extended version of the standard membership from onegov.people. """

__mapper_args__ = {'polymorphic_identity': 'extended'}

es_type_name = 'extended_membership'

#: The prefix character.
prefix = meta_property()

#: A note to the membership.
note = meta_property()

#: An addition to the membership.
addition = meta_property()
1 change: 1 addition & 0 deletions onegov/agency/models/person.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


class ExtendedPerson(Person):
""" An extended version of the standard person from onegov.people. """

__mapper_args__ = {'polymorphic_identity': 'extended'}

Expand Down
30 changes: 19 additions & 11 deletions onegov/agency/templates/macros.pt
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,15 @@

<tal:block tal:condition="memberships">
<h3 i18n:translate>People</h3>
<dl>
<dl class="memberships">
<tal:block tal:repeat="membership memberships">
<tal:block tal:condition="request.is_logged_in">
<dt><em><a style="text" href="${request.link(membership)}">${membership.title}</a></em></dt>
<dd><a href="${request.link(membership.person)}">${membership.person.title}</a></dd>
</tal:block>
<tal:block tal:condition="not:request.is_logged_in">
<dt>${membership.title}</dt>
<dd><a href="${request.link(membership.person)}">${membership.person.title}</a></dd>
</tal:block>
<br>
<dt>
<a style="text" href="${request.link(membership)}">${membership.title}</a>
</dt>
<dd>
<span tal:condition="membership.prefix|None">${membership.prefix}</span>
<a href="${request.link(membership.person)}">${membership.person.title}</a>
</dd>
</tal:block>
</dl>
</tal:block>
Expand Down Expand Up @@ -162,10 +160,20 @@
<dd><a href="${request.link(membership.person)}">${membership.person.title}</a></dd>
</tal:block>

<tal:block tal:condition="membership.since">
<tal:block tal:condition="membership.since|None">
<dt i18n:translate>Since</dt>
<dd>${membership.since}</dd>
</tal:block>

<tal:block tal:condition="membership.note|None">
<dt i18n:translate>Note</dt>
<dd>${membership.note}</dd>
</tal:block>

<tal:block tal:condition="membership.addition|None">
<dt i18n:translate>Addition</dt>
<dd>${membership.addition}</dd>
</tal:block>
</dl>
</div>
</metal:membership_card>
Expand Down
Binary file modified onegov/agency/tests/fixtures/export-pdf.xls
Binary file not shown.
Binary file modified onegov/agency/tests/fixtures/export.xls
Binary file not shown.
6 changes: 4 additions & 2 deletions onegov/agency/tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,11 @@ def raise_for_status(self):
assert person.salutation == "Herr"

membership = person.memberships.one()
assert membership.meta['prefix'] == "xx"
assert membership.since == "2000"
assert membership.title == "Stimmenzähler"
assert membership.since == "2000"
assert membership.addition == "yy"
assert membership.note == "zz"
assert membership.prefix == "xx"


@mark.parametrize("file", [
Expand Down
10 changes: 8 additions & 2 deletions onegov/agency/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,17 @@ def test_membership_form(session):

form = MembershipForm(DummyPostData({
'person_id': str(doctor.id),
'since': "2000",
'title': "Doctor",
'since': "2000",
'addition': "Surgery",
'note': "Retired",
'prefix': "*",
}))
assert form.get_useful_data() == {
'person_id': str(doctor.id),
'since': "2000",
'title': "Doctor",
'addition': "Surgery",
'note': "Retired",
'since': "2000",
'prefix': "*",
}
70 changes: 63 additions & 7 deletions onegov/agency/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
from onegov.agency.models import ExtendedAgency
from onegov.agency.models import ExtendedAgencyMembership
from onegov.agency.models import ExtendedPerson
from onegov.people import Agency
from onegov.people import AgencyMembership
from onegov.people import Person


def test_extended_agency(agency_app):
Expand All @@ -10,23 +14,21 @@ def test_extended_agency(agency_app):
name="test-agency",
portrait="This is a test\nagency."
)

session.add(agency)
session.flush()

agency = session.query(ExtendedAgency).one()

agency = session.query(Agency).one()
assert isinstance(agency, ExtendedAgency)
assert agency.type == 'extended'
assert agency.title == "Test Agency"
assert agency.name == "test-agency"
assert agency.portrait == "This is a test\nagency."
assert agency.portrait_html == "<p>This is a test<br>agency.</p>"

assert agency.export_fields == []
assert agency.state is None
assert agency.pdf is None
assert agency.pdf_file is None
assert agency.trait == 'agency'

assert agency.proxy().id == agency.id

agency.pdf_file = b'PDF'
Expand All @@ -40,6 +42,21 @@ def test_extended_agency(agency_app):
assert agency.pdf.name == 'test-agency.pdf'


def test_extended_agency_add_person(session):
agency = ExtendedAgency(title="Agency", name="agency",)
person = ExtendedPerson(first_name="A", last_name="Person")
session.add(person)
session.flush()

agency.add_person(person.id, "Staff", since="2012", note="N", prefix="*")
membership = agency.memberships.one()

assert isinstance(membership, ExtendedAgencyMembership)
assert membership.since == "2012"
assert membership.note == "N"
assert membership.prefix == "*"


def test_extended_person(session):
person = ExtendedPerson(
first_name="Hans",
Expand All @@ -56,8 +73,9 @@ def test_extended_person(session):
session.add(person)
session.flush()

person = session.query(ExtendedPerson).one()

person = session.query(Person).one()
assert isinstance(person, ExtendedPerson)
assert person.type == 'extended'
assert person.first_name == "Hans"
assert person.last_name == "Maulwurf"
assert person.academic_title == "Dr."
Expand All @@ -70,3 +88,41 @@ def test_extended_person(session):
assert person.address_html == "<p>Street 1<br>City</p>"
assert person.notes == "This is\na note."
assert person.notes_html == "<p>This is<br>a note.</p>"


def test_extended_membership(session):
agency = Agency(title='agency', name='agency')
person = Person(first_name='a', last_name='person')
session.add(agency)
session.add(person)
session.flush()

session.add(
ExtendedAgencyMembership(
title="Director",
order=12,
since="2012",
note="Interim",
addition="Production",
prefix="*",
agency_id=agency.id,
person_id=person.id
)
)
session.flush()

membership = session.query(AgencyMembership).one()
assert isinstance(membership, ExtendedAgencyMembership)
assert membership.type == 'extended'
assert membership.title == "Director"
assert membership.order == 12
assert membership.since == "2012"
assert membership.note == "Interim"
assert membership.addition == "Production"
assert membership.prefix == "*"
assert membership.agency_id == agency.id
assert membership.person_id == person.id
assert membership.agency == agency
assert membership.person == person
assert agency.memberships.one() == membership
assert person.memberships.one() == membership
Loading

0 comments on commit 4ccd00b

Please sign in to comment.