From a6dbafcce8151c3c0332677cdc753f2a03c88030 Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 12 Oct 2009 06:05:14 +0000 Subject: [PATCH] new view list_children.html; action options for queries; send mail feature basically working; presence with link to person git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3575 fd906abe-77d9-0310-91a1-e0d9ade77398 --- CHANGES.txt | 3 +++ browser/concept.py | 15 +++++++++++---- browser/concept_macros.pt | 11 ++++++++++- browser/configure.zcml | 10 ++++++++++ browser/node.py | 9 +++++++-- browser/node_macros.pt | 5 ++++- interfaces.py | 3 ++- locales/de/LC_MESSAGES/loops.mo | Bin 9931 -> 10153 bytes locales/de/LC_MESSAGES/loops.po | 14 +++++++++++++- organize/README.txt | 1 + organize/browser/configure.zcml | 7 +++++++ organize/browser/party.py | 23 +++++++++++++++++++++++ organize/browser/view_macros.pt | 11 ++++++++--- organize/presence.py | 7 +++++-- 14 files changed, 104 insertions(+), 15 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 8fb0236..9554e61 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,6 +8,9 @@ $Id$ New features +- new view: ``list_children.html`` +- evaluate action settings also on queries +- "send email" feature, controlled by global option ``organize.allowSendEmail`` - presence: portlet showing other users logged-in and working within the same loops site, controlled by global option ``organize.showPresence`, using new LoopsSessionCredentialsPlugin; diff --git a/browser/concept.py b/browser/concept.py index e9f47d4..5b98c5e 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2009 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -352,9 +352,8 @@ class ConceptView(BaseView): def getActions(self, category='object', page=None, target=None): acts = [] - t = IType(self.context) - actInfo = t.optionsDict.get('action.' + category, '') - actNames = [n.strip() for n in actInfo.split(',')] + optKey = 'action.' + category + actNames = (self.options(optKey) or []) + (self.typeOptions(optKey) or []) if actNames: acts = list(actions.get(category, actNames, view=self, page=page, target=target)) @@ -508,3 +507,11 @@ class ConceptConfigureView(ConceptView): yield terms.getTerm(pred) +# query views + +class ListChildren(ConceptView): + + @Lazy + def macro(self): + return concept_macros.macros['list_children'] + diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index 046f532..c55c55c 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -93,7 +93,8 @@ ondblclick python: item.openEditWindow('configure.html')" tal:define="children python: list(item.children())" tal:condition="children"> -

Children

+

Children

@@ -218,6 +219,14 @@ + +
+
+ +
+
+ + diff --git a/browser/configure.zcml b/browser/configure.zcml index b357eed..7f0af0d 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -531,6 +531,16 @@ + + + + -
+
+
diff --git a/interfaces.py b/interfaces.py index 0760ab5..c58d16d 100644 --- a/interfaces.py +++ b/interfaces.py @@ -600,7 +600,8 @@ class IConceptRelation(IDyadicRelation): """ predicate = Attribute("A concept of type 'predicate' that defines the " - "type of the relation-") + "type of the relation.") + relevance = Attribute("A float between 0 and 1.") # interfaces for catalog indexes diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 0a3cacd0fb98346d883f1117294ca4badac7c2eb..b714402504eba81077b778828ca7985898603618 100644 GIT binary patch delta 4090 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 nTK!tL)3Uf)GCbAsu&$Za\n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -98,6 +98,18 @@ msgstr "Glossareintrag anlegen..." msgid "Create Glossary Item" msgstr "Glossareintrag anlegen" +msgid "Create Person..." +msgstr "Person anlegen..." + +msgid "Create a new person." +msgstr "Eine neue Person anlegen" + +msgid "Edit Person..." +msgstr "Person bearbeiten..." + +msgid "Modify person." +msgstr "Person bearbeiten" + msgid "Create Resource, Type = " msgstr "Ressource anlegen, Typ = " diff --git a/organize/README.txt b/organize/README.txt index af84133..131ec33 100644 --- a/organize/README.txt +++ b/organize/README.txt @@ -364,6 +364,7 @@ OK, the action is not provided automatically any more by the TaskView but has to be entered as a type option. >>> adapted(task).options = ['action.portlet:editTask'] + >>> view = TaskView(task01, TestRequest()) >>> list(view.getActions('portlet')) [] diff --git a/organize/browser/configure.zcml b/organize/browser/configure.zcml index 2162574..8c122eb 100644 --- a/organize/browser/configure.zcml +++ b/organize/browser/configure.zcml @@ -62,6 +62,13 @@ class="loops.organize.browser.party.SendEmailForm" permission="zope.View" /> + + -
- +
Send Link by Email -
@@ -78,11 +78,16 @@
- Johnny (Johnny)
+
+ + Toggle all
diff --git a/organize/presence.py b/organize/presence.py index b1b951f..766f146 100644 --- a/organize/presence.py +++ b/organize/presence.py @@ -30,6 +30,7 @@ from zope.cachedescriptors.property import Lazy from cybertools.meta.interfaces import IOptions from cybertools.util.date import getTimeStamp from loops.organize.interfaces import IPresence +from loops.organize.party import getPersonForUser from loops.organize import util @@ -57,10 +58,12 @@ class Presence(object): if id in self.presentUsers: del self.presentUsers[id] - def getPresentUsers(self): + def getPresentUsers(self, context=None): ret = [] for id, timeStamp in self.presentUsers.iteritems(): - ret.append(util.getPrincipalForUserId(id).title) + principal = util.getPrincipalForUserId(id) + person = getPersonForUser(context, principal=principal) + ret.append(person or principal) return ret def removePresentUser(self, principalId):
Title