Skip to content

Commit db9a085

Browse files
committed
Add the date content type
1 parent 018bdcf commit db9a085

6 files changed

Lines changed: 133 additions & 0 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from plone.dexterity.content import Item
2+
3+
4+
5+
class ExperimentalDoodleDate(Item):
6+
"""Single date option for a doodle poll (MVP)."""
7+
8+
# Marker class for the experimental.doodle.date type
9+
pass

src/experimental/doodle/interfaces.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,19 @@ class IExperimentalDoodleFolder(model.Schema):
2424
title="Body",
2525
required=False,
2626
)
27+
28+
29+
class IExperimentalDoodleDate(model.Schema):
30+
"""Single date option inside a Doodle folder (MVP)"""
31+
32+
date = schema.Date(
33+
title="Date",
34+
required=True,
35+
)
36+
37+
participants = schema.Set(
38+
title="Participants",
39+
description="User ids who selected this date.",
40+
value_type=schema.TextLine(),
41+
required=False,
42+
)

src/experimental/doodle/permissions.zcml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,9 @@
55
title="experimental.doodle: Add Doodle Folder"
66
/>
77

8+
<permission
9+
id="experimental.doodle.AddDoodleDate"
10+
title="experimental.doodle: Add Doodle Date"
11+
/>
12+
813
</configure>

src/experimental/doodle/profiles/default/types.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@
55
<object meta_type="Dexterity FTI"
66
name="experimental.doodle.folder"
77
/>
8+
<object meta_type="Dexterity FTI"
9+
name="experimental.doodle.date"
10+
/>
811
</object>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<object xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3+
meta_type="Dexterity FTI"
4+
name="experimental.doodle.date"
5+
i18n:domain="experimental.doodle"
6+
>
7+
<property name="title"
8+
i18n:translate=""
9+
>Doodle Date</property>
10+
<property name="description"
11+
i18n:translate=""
12+
>Single date option in a doodle folder.</property>
13+
<property name="icon_expr">string:contenttype/event</property>
14+
<property name="factory">experimental.doodle.date</property>
15+
<property name="add_view_expr">string:${folder_url}/++add++experimental.doodle.date</property>
16+
<property name="link_target" />
17+
<property name="immediate_view">view</property>
18+
<property name="global_allow">False</property>
19+
<property name="filter_content_types">False</property>
20+
<property name="allowed_content_types" />
21+
<property name="allow_discussion">False</property>
22+
<property name="default_view">view</property>
23+
<property name="view_methods">
24+
<element value="view" />
25+
</property>
26+
<property name="default_view_fallback">False</property>
27+
<property name="add_permission">experimental.doodle.AddDoodleDate</property>
28+
<property name="klass">experimental.doodle.content.date.ExperimentalDoodleDate</property>
29+
<property name="schema">experimental.doodle.interfaces.IExperimentalDoodleDate</property>
30+
<property name="model_source" />
31+
<property name="model_file" />
32+
<property name="behaviors">
33+
<element value="plone.namefromtitle" />
34+
<element value="plone.dublincore" />
35+
<element value="plone.basic" />
36+
<element value="plone.excludefromnavigation" />
37+
<element value="plone.shortname" />
38+
<element value="plone.ownership" />
39+
<element value="plone.publication" />
40+
<element value="plone.categorization" />
41+
<element value="plone.locking" />
42+
<element value="plone.versioning" />
43+
</property>
44+
<alias from="(Default)"
45+
to="(dynamic view)"
46+
/>
47+
<alias from="edit"
48+
to="@@edit"
49+
/>
50+
<alias from="sharing"
51+
to="@@sharing"
52+
/>
53+
<alias from="view"
54+
to="(selected layout)"
55+
/>
56+
<action action_id="view"
57+
category="object"
58+
condition_expr=""
59+
title="View"
60+
url_expr="string:${object_url}"
61+
visible="True"
62+
>
63+
<permission value="View" />
64+
</action>
65+
<action action_id="edit"
66+
category="object"
67+
condition_expr=""
68+
title="Edit"
69+
url_expr="string:${object_url}/edit"
70+
visible="True"
71+
>
72+
<permission value="Modify portal content" />
73+
</action>
74+
</object>

tests/setup/test_setup_install.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,29 @@ def test_folder_type_add_permission(self, portal):
2424
"""Test folder content type uses custom add permission."""
2525
fti = portal.portal_types["experimental.doodle.folder"]
2626
assert fti.add_permission == "experimental.doodle.AddDoodleFolder"
27+
28+
def test_date_type_installed(self, portal):
29+
"""Test date content type is registered."""
30+
assert "experimental.doodle.date" in portal.portal_types
31+
32+
def test_date_type_add_permission(self, portal):
33+
"""Test date content type uses custom add permission."""
34+
fti = portal.portal_types["experimental.doodle.date"]
35+
assert fti.add_permission == "experimental.doodle.AddDoodleDate"
36+
37+
def test_folder_allows_only_date_type(self, portal):
38+
"""Test folder is configured to accept only date items."""
39+
fti = portal.portal_types["experimental.doodle.folder"]
40+
assert fti.filter_content_types is True
41+
assert fti.allowed_content_types == ("experimental.doodle.date",)
42+
43+
def test_folder_default_view_is_doodle(self, portal):
44+
"""Test folder type defaults to the doodle layout."""
45+
fti = portal.portal_types["experimental.doodle.folder"]
46+
assert fti.default_view == "doodle"
47+
assert fti.immediate_view == "doodle"
48+
49+
def test_date_type_not_global(self, portal):
50+
"""Test date type is not globally addable."""
51+
fti = portal.portal_types["experimental.doodle.date"]
52+
assert fti.global_allow is False

0 commit comments

Comments
 (0)