From d4f4d965e1f4c3b4b7ecd89bf0b4ee653a80245b Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 29 Apr 2013 08:39:14 +0200 Subject: [PATCH 01/23] improve questionnaire layout --- browser/skin/lobo/lobo.css | 8 ++++++++ knowledge/survey/browser.py | 2 +- knowledge/survey/view_macros.pt | 9 +++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/browser/skin/lobo/lobo.css b/browser/skin/lobo/lobo.css index ec06252..3e15e5c 100644 --- a/browser/skin/lobo/lobo.css +++ b/browser/skin/lobo/lobo.css @@ -120,6 +120,10 @@ thead th { margin-bottom: 0.3em; } +.infotext { + font-size: 90%; +} + .fields td { vertical-align: top; } @@ -163,6 +167,10 @@ table.listing td { border-bottom: 1px dotted #dddddd; } +table.listing tr.vpad td { + padding: 7px 2px 7px 2px; +} + fieldset.box table.listing td { padding: 0 1px 0 1px; } diff --git a/knowledge/survey/browser.py b/knowledge/survey/browser.py index 99eac6d..d9075d6 100644 --- a/knowledge/survey/browser.py +++ b/knowledge/survey/browser.py @@ -112,7 +112,7 @@ class SurveyView(ConceptView): mapping=dict(minAnswers=qugroup.minAnswers)), target_language=lang) if info: - text = u'%s
(%s)' % (text, info) + text = u'%s
(%s)' % (text, info) return text def getValues(self, question): diff --git a/knowledge/survey/view_macros.pt b/knowledge/survey/view_macros.pt index 51c2c6a..bdb6ded 100644 --- a/knowledge/survey/view_macros.pt +++ b/knowledge/survey/view_macros.pt @@ -47,12 +47,12 @@ - + - + + + - @@ -119,6 +121,8 @@ tal:attributes="value typeToken" /> + + - diff --git a/browser/skin/lobo/body.pt b/browser/skin/lobo/body.pt index f1f08c6..2a3ea56 100644 --- a/browser/skin/lobo/body.pt +++ b/browser/skin/lobo/body.pt @@ -30,7 +30,13 @@
-
+ +
+
-
+ +
+
0: + # show form again + return True + login = form.get('loginName') + regMan = IMemberRegistrationManager(self.context.getLoopsRoot()) + pw = generateName() + email = form.get('email') + result = regMan.register(login, pw, + form.get('lastName'), form.get('firstName'), + email=email,) + if isinstance(result, dict): + fi = formState.fieldInstances[result['fieldName']] + fi.setError(result['error'], self.formErrors) + formState.severity = max(formState.severity, fi.severity) + return True + self.object = result + person = result.context + pa = self.getPrincipalAnnotation( + getPrincipalForUserId(adapted(person).getUserId())) + pa['id'] = generateName() + pa['timestamp'] = datetime.utcnow() + self.notifyEmail(login, email, pa['id']) + msg = self.message + self.request.response.redirect('%s?loops.message=%s' % (self.url, msg)) + return False - # TODO: control form via interface? + def notifyEmail(self, userid, recipient, id): + baseUrl = absoluteURL(self.context.getMenu(), self.request) + url = u'%s/selfservice_confirmation.html?login=%s&id=%s' % ( + baseUrl, userid, id,) + recipients = [recipient] + message = u'Um die Anmeldung abzuschliessen muessen Sie folgenden Link betaetigen:\n\n' + message = (message + url).encode('UTF-8') + sender = 'webmaster@zeitraum-bayern.de' + msg = MIMEText(message, 'plain', 'utf-8') + msg['Subject'] = 'Benutzer-Registrierung' + msg['From'] = sender + msg['To'] = ', '.join(recipients) + mailhost = component.getUtility(IMailDelivery, 'Mail') + mailhost.send(sender, recipients, msg.as_string()) + + +class ConfirmMemberRegistration(BaseMemberRegistration, Form): + + permissions_key = u'secure_registration.permissions' + roles_key = u'secure_registration.roles' + + template = form_macros + isInnerHtml = False + showAssignments = False + form_action = 'confirm_registration' + + def closeAction(self, submit=True): + return u'' @Lazy def macro(self): return organize_macros.macros['confirm'] + @Lazy + def data(self): + form = self.request.form + return dict(loginName=form.get('login'), id=form.get('id')) + + @Lazy + def schema(self): + schema = super(ConfirmMemberRegistration, self).schema + schema.fields.remove('birthDate') + schema.fields.remove('phoneNumbers') + schema.fields.loginName.readonly = True + schema.fields.reorder(-2, 'loginName') + schema.fields.firstName.readonly = True + schema.fields.lastName.readonly = True + schema.fields.firstName.readonly = True + schema.fields.email.readonly = True + return schema + + def update(self): + form = self.request.form + if form.get('form.action') != 'confirm_registration': + return True + if not form.get('login'): + return True + regMan = IMemberRegistrationManager(self.context.getLoopsRoot()) + prefix = regMan.getPrincipalFolderFromOption().prefix + userId = prefix + form['login'] + principal = getPrincipalForUserId(userId) + pa = self.getPrincipalAnnotation(principal) + id = form.get('id') + if not id or id != pa.get('id'): + return True + pw = form.get('password') + pwConfirm = form.get('passwordConfirm') + if pw != pwConfirm: + msg = self.errorMessages['confirm_nomatch'] + self.request.form['message'] = msg + return True + del pa['id'] + del pa['timestamp'] + ip = getInternalPrincipal(userId) + ip.setPassword(pw) + url = '%s?loops.message=%s' % (self.url, self.message) + self.request.response.redirect(url) + return False + class PasswordChange(NodeView, Form): diff --git a/organize/browser/view_macros.pt b/organize/browser/view_macros.pt index af8ea2b..ecc21ad 100644 --- a/organize/browser/view_macros.pt +++ b/organize/browser/view_macros.pt @@ -1,7 +1,22 @@ - - + + + + +
+ + + diff --git a/organize/member.py b/organize/member.py index 9753bd6..09e5326 100644 --- a/organize/member.py +++ b/organize/member.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 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 @@ -62,11 +62,20 @@ class MemberRegistrationManager(object): def __init__(self, context): self.context = context + @Lazy + def personType(self): + concepts = self.context.getConceptManager() + return adapted(concepts[self.person_typeName]) + + def getPrincipalFolderFromOption(self): + options = IOptions(self.personType) + pfName = options(self.principalfolder_key, + (self.default_principalfolder,))[0] + return getPrincipalFolder(self.context, pfName) + def register(self, userId, password, lastName, firstName=u'', groups=[], useExisting=False, pfName=None, **kw): - concepts = self.context.getConceptManager() - personType = adapted(concepts[self.person_typeName]) - options = IOptions(personType) + options = IOptions(self.personType) if pfName is None: pfName = options(self.principalfolder_key, (self.default_principalfolder,))[0] @@ -74,7 +83,7 @@ class MemberRegistrationManager(object): if len(groups)==0: groups = options(self.groups_key, ()) self.setGroupsForPrincipal(pfName, userId, groups=groups) - self.createPersonForPrincipal(pfName, userId, lastName, firstName, + return self.createPersonForPrincipal(pfName, userId, lastName, firstName, useExisting, **kw) def createPrincipal(self, pfName, userId, password, lastName, From 9427b8ccbd74d561b451b41f6fca596cd1d4bea0 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 6 May 2013 08:00:09 +0200 Subject: [PATCH 06/23] self registration with confirmation working (needs still improvements: sender email, info messages) --- locales/de/LC_MESSAGES/loops.mo | Bin 23689 -> 23981 bytes locales/de/LC_MESSAGES/loops.po | 11 +++++++- organize/browser/member.py | 45 ++++++++++++++++++++------------ organize/member.py | 3 ++- 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 9ebc458fe70403c8fea5c10820767a09f829c035..b0317196556620a3f9a8c56118766a5291aa3c4c 100644 GIT binary patch delta 8698 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 ACjbBd delta 8443 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\n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -86,6 +86,9 @@ msgstr "Thema bearbeiten..." msgid "Modify topic." msgstr "Thema ändern" +msgid "Please correct the indicated errors." +msgstr "Bitte berichtigen Sie die angezeigten Fehler." + # blog msgid "Edit Blog Post..." @@ -759,12 +762,18 @@ msgstr "Teilnehmerregistrierung" msgid "Register" msgstr "Benutzer registrieren" +msgid "Login name already taken." +msgstr "Die von Ihnen eingegebene Benutzerkennung ist schon vergeben." + msgid "Your old password was not entered correctly." msgstr "Sie haben Ihr altes Passwort nicht korrekt eingegeben." msgid "Password and password confirmation do not match." msgstr "Die Passwort-Wiederholung stimmt nicht mit dem eingegebenen Passwort überein." +msgid "The user account has been created." +msgstr "Ihr Benutzerkonto wurde eingerichtet." + msgid "Your password has been changed." msgstr "Ihr Passwort wurde geändert." diff --git a/organize/browser/member.py b/organize/browser/member.py index 8abe37b..502c71f 100644 --- a/organize/browser/member.py +++ b/organize/browser/member.py @@ -111,6 +111,10 @@ class BaseMemberRegistration(NodeView): def item(self): return self + @Lazy + def data(self): + return self.request.form + def getPrincipalAnnotation(self, principal): return annotations(principal).get(ANNOTATION_KEY, None) @@ -201,12 +205,13 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm): regMan = IMemberRegistrationManager(self.context.getLoopsRoot()) pw = generateName() email = form.get('email') - result = regMan.register(login, pw, - form.get('lastName'), form.get('firstName'), - email=email,) - if isinstance(result, dict): - fi = formState.fieldInstances[result['fieldName']] - fi.setError(result['error'], self.formErrors) + try: + result = regMan.register(login, pw, + form.get('lastName'), form.get('firstName'), + email=email,) + except ValueError, e: + fi = formState.fieldInstances['loginName'] + fi.setError('duplicate_loginname', self.formErrors) formState.severity = max(formState.severity, fi.severity) return True self.object = result @@ -225,11 +230,11 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm): url = u'%s/selfservice_confirmation.html?login=%s&id=%s' % ( baseUrl, userid, id,) recipients = [recipient] - message = u'Um die Anmeldung abzuschliessen muessen Sie folgenden Link betaetigen:\n\n' + message = _(u'confirmation_mail_text') + u':\n\n' message = (message + url).encode('UTF-8') - sender = 'webmaster@zeitraum-bayern.de' + sender = 'helmutm@cy55.de' msg = MIMEText(message, 'plain', 'utf-8') - msg['Subject'] = 'Benutzer-Registrierung' + msg['Subject'] = _(u'confirmation_mail_subject') msg['From'] = sender msg['To'] = ', '.join(recipients) mailhost = component.getUtility(IMailDelivery, 'Mail') @@ -263,12 +268,10 @@ class ConfirmMemberRegistration(BaseMemberRegistration, Form): schema = super(ConfirmMemberRegistration, self).schema schema.fields.remove('birthDate') schema.fields.remove('phoneNumbers') - schema.fields.loginName.readonly = True - schema.fields.reorder(-2, 'loginName') - schema.fields.firstName.readonly = True - schema.fields.lastName.readonly = True - schema.fields.firstName.readonly = True - schema.fields.email.readonly = True + schema.fields.remove('loginName') + schema.fields.remove('firstName') + schema.fields.remove('lastName') + schema.fields.remove('email') return schema def update(self): @@ -285,11 +288,19 @@ class ConfirmMemberRegistration(BaseMemberRegistration, Form): id = form.get('id') if not id or id != pa.get('id'): return True + instance = component.getAdapter(self.object, IInstance, name='editor') + instance.template = self.schema + self.formState = formState = instance.applyTemplate(data=form, + fieldHandlers=self.fieldHandlers) + #formState = self.formState = self.validate(form) + if formState.severity > 0: + return True pw = form.get('password') pwConfirm = form.get('passwordConfirm') if pw != pwConfirm: - msg = self.errorMessages['confirm_nomatch'] - self.request.form['message'] = msg + fi = formState.fieldInstances['password'] + fi.setError('confirm_nomatch', self.formErrors) + formState.severity = max(formState.severity, fi.severity) return True del pa['id'] del pa['timestamp'] diff --git a/organize/member.py b/organize/member.py index 09e5326..88428aa 100644 --- a/organize/member.py +++ b/organize/member.py @@ -79,7 +79,8 @@ class MemberRegistrationManager(object): if pfName is None: pfName = options(self.principalfolder_key, (self.default_principalfolder,))[0] - self.createPrincipal(pfName, userId, password, lastName, firstName, useExisting=useExisting) + self.createPrincipal(pfName, userId, password, lastName, firstName, + useExisting=useExisting) if len(groups)==0: groups = options(self.groups_key, ()) self.setGroupsForPrincipal(pfName, userId, groups=groups) From d84e8de9a09cf761a0eeb89d55ec47753ff46f0a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 6 May 2013 12:21:50 +0200 Subject: [PATCH 07/23] handle missing properties in Office file correctly --- integrator/office/base.py | 18 +++++++++--------- locales/de/LC_MESSAGES/loops.po | 6 ++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/integrator/office/base.py b/integrator/office/base.py index bed343b..542aa0a 100644 --- a/integrator/office/base.py +++ b/integrator/office/base.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 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 @@ -78,28 +78,28 @@ class OfficeFile(ExternalFileAdapter): @Lazy def docPropertyDom(self): fn = self.docFilename - dummy = dict(core=[], custom=[]) + result = dict(core=[], custom=[]) root, ext = os.path.splitext(fn) if not ext.lower() in self.fileExtensions: - return dummy + return result try: zf = ZipFile(fn, 'r') except IOError, e: from logging import getLogger self.logger.warn(e) - return dummy + return result if self.corePropFileName not in zf.namelist(): self.logger.warn('Core properties not found in file %s.' % self.externalAddress) + else: + result['core'] = etree.fromstring(zf.read(self.corePropFileName)) if self.propFileName not in zf.namelist(): self.logger.warn('Custom properties not found in file %s.' % self.externalAddress) - propsXml = zf.read(self.propFileName) - corePropsXml = zf.read(self.corePropFileName) - # TODO: read core.xml, return both trees in dictionary + else: + result['custom'] = etree.fromstring(zf.read(self.propFileName)) zf.close() - return {'custom': etree.fromstring(propsXml), - 'core': etree.fromstring(corePropsXml)} + return result def getDocProperty(self, pname): for p in self.docPropertyDom['custom']: diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 2e143ef..3d0a6bb 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -771,6 +771,12 @@ msgstr "Sie haben Ihr altes Passwort nicht korrekt eingegeben." msgid "Password and password confirmation do not match." msgstr "Die Passwort-Wiederholung stimmt nicht mit dem eingegebenen Passwort überein." +msgid "confirmation_mail_subject" +msgstr "Benutzer-Registrierung" + +msgid "confirmation_mail_text." +msgstr "Bitte clicken Sie auf den folgenden Link, um die Anmeldung abzschließen." + msgid "The user account has been created." msgstr "Ihr Benutzerkonto wurde eingerichtet." From 3f1ffdb8f4f44c71541c5368e6866981ae490195 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 17 May 2013 11:30:10 +0200 Subject: [PATCH 08/23] work in progress: info texts and feedback pages for self-service registration --- browser/common.py | 2 +- locales/de/LC_MESSAGES/loops.mo | Bin 23981 -> 24159 bytes locales/de/LC_MESSAGES/loops.po | 2 +- organize/README.txt | 2 +- organize/browser/member.py | 72 +++++++++++++++++++++++++------- organize/browser/view_macros.pt | 7 ++++ 6 files changed, 66 insertions(+), 19 deletions(-) diff --git a/browser/common.py b/browser/common.py index 8639958..d8886e3 100644 --- a/browser/common.py +++ b/browser/common.py @@ -481,7 +481,7 @@ class BaseView(GenericView, I18NView): return absoluteURL(provider, self.request) return None - def renderText(self, text, contentType): + def renderText(self, text, contentType='text/restructured'): text = util.toUnicode(text) typeKey = util.renderingFactories.get(contentType, None) if typeKey is None: diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index b0317196556620a3f9a8c56118766a5291aa3c4c..ad3d32055612f5c99ce41d9468b0b9cced058617 100644 GIT binary patch delta 7346 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 UTTtlt?ceAtYP~ID%=()D1F?2ma{vGU delta 7169 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 + + + + + + + + + + + - - + + + + From bc24407d343da3b40d216722f693dc63c28d3a44 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 7 Jun 2013 09:17:27 +0200 Subject: [PATCH 12/23] add header field for feedback page --- knowledge/survey/interfaces.py | 7 +++++++ knowledge/survey/view_macros.pt | 3 +++ 2 files changed, 10 insertions(+) diff --git a/knowledge/survey/interfaces.py b/knowledge/survey/interfaces.py index 7ce5849..e2adffc 100644 --- a/knowledge/survey/interfaces.py +++ b/knowledge/survey/interfaces.py @@ -38,6 +38,13 @@ class IQuestionnaire(IConceptSchema, interfaces.IQuestionnaire): default=4, required=True) + feedbackHeader = schema.Text( + title=_(u'Feedback Header'), + description=_(u'Text that will appear at the top of the feedback page.'), + default=u'', + missing_value=u'', + required=False) + feedbackFooter = schema.Text( title=_(u'Feedback Footer'), description=_(u'Text that will appear at the end of the feedback page.'), diff --git a/knowledge/survey/view_macros.pt b/knowledge/survey/view_macros.pt index bdb6ded..9e7593c 100644 --- a/knowledge/survey/view_macros.pt +++ b/knowledge/survey/view_macros.pt @@ -11,6 +11,9 @@

Feedback

+
 
-
+
-
 
Does not apply
From d0243d056423b3dceca82d7d24c3dbad44f998e6 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 1 May 2013 10:44:43 +0200 Subject: [PATCH 02/23] no underline for elements of any kind --- browser/skin/lobo/lobo.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/browser/skin/lobo/lobo.css b/browser/skin/lobo/lobo.css index 3e15e5c..13665e8 100644 --- a/browser/skin/lobo/lobo.css +++ b/browser/skin/lobo/lobo.css @@ -62,6 +62,10 @@ h1, h2, h3, h4, h5, h6 { margin-bottom: 0.4em; } +a { + text-decoration: none; +} + a[href]:hover { text-decoration: none; color: #6060c0; From 135aa74d9c2934d05a7ddd89643b2bf252a76ce9 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 2 May 2013 15:24:05 +0200 Subject: [PATCH 03/23] reverse parts of header title if specified by global option reverseHeadTitle --- browser/node.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/browser/node.py b/browser/node.py index 270f459..a49a350 100644 --- a/browser/node.py +++ b/browser/node.py @@ -385,6 +385,8 @@ class NodeView(BaseView): ht = super(NodeView, self).headTitle if ht not in parts: parts.append(ht) + if self.globalOptions('reverseHeadTitle'): + parts.reverse() return ' - ' .join(parts) @Lazy From 90b4da1a9ba02ffb9652269c80d7cdaf999bd121 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 4 May 2013 08:55:25 +0200 Subject: [PATCH 04/23] improve position of top and page actions --- browser/skin/lobo/lobo.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/browser/skin/lobo/lobo.css b/browser/skin/lobo/lobo.css index 13665e8..4fbcbd3 100644 --- a/browser/skin/lobo/lobo.css +++ b/browser/skin/lobo/lobo.css @@ -279,7 +279,8 @@ fieldset.box td { .top-actions { position: absolute; - top: 30px; + top: 40px; + margin-left: 10px; } .quicksearch input { @@ -293,7 +294,7 @@ fieldset.box td { .page-actions { position: absolute; - top: 55px; + top: 75px; margin-left: 210px; } From 7b9a85a586f0e4a5f2addcaf89b3279831129be7 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 5 May 2013 16:55:11 +0200 Subject: [PATCH 05/23] self registration with confirmation: basically working; missing: translations, sender email, improved error handling --- browser/form_macros.pt | 8 +- browser/skin/lobo/body.pt | 8 +- compound/book/browser.py | 3 + compound/book/view_macros.pt | 8 +- organize/browser/member.py | 136 ++++++++++++++++++++++++++++++-- organize/browser/view_macros.pt | 19 ++++- organize/member.py | 19 +++-- 7 files changed, 180 insertions(+), 21 deletions(-) diff --git a/browser/form_macros.pt b/browser/form_macros.pt index 63543d3..47e846b 100644 --- a/browser/form_macros.pt +++ b/browser/form_macros.pt @@ -51,6 +51,8 @@
@@ -59,7 +61,7 @@
@@ -127,7 +131,7 @@
+ + + + +
Login Name +
+
From ce22ab2a4b3c3a4158c5c26b44d86e4b34c7a1ae Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 21 May 2013 11:36:19 +0200 Subject: [PATCH 09/23] provide create_object action for allow creation of resources within specific concept types; do not limit book views to Lobo skin --- browser/action.py | 9 +++++++++ compound/book/configure.zcml | 6 +++--- compound/book/loops_book_de.dmp | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/browser/action.py b/browser/action.py index 06600c5..4ac0b03 100644 --- a/browser/action.py +++ b/browser/action.py @@ -123,6 +123,15 @@ actions.register('external_edit', 'object', TargetAction, cssClass='icon-action', ) +actions.register('create_object', 'portlet', DialogAction, + title=_('Create Resource...'), + description=_('Create a new resource object.'), + viewName='create_object.html', + dialogName='edit', + prerequisites=['registerDojoEditor'], + permission='zope.ManageContent', +) + actions.register('edit_object', 'portlet', DialogAction, title=_(u'Edit Resource...'), description=_(u'Modify resource object.'), diff --git a/compound/book/configure.zcml b/compound/book/configure.zcml index 09a374a..6d3ba0d 100644 --- a/compound/book/configure.zcml +++ b/compound/book/configure.zcml @@ -8,7 +8,7 @@ @@ -16,7 +16,7 @@ @@ -24,7 +24,7 @@ diff --git a/compound/book/loops_book_de.dmp b/compound/book/loops_book_de.dmp index a7d846f..1a9e4d9 100644 --- a/compound/book/loops_book_de.dmp +++ b/compound/book/loops_book_de.dmp @@ -26,6 +26,7 @@ concept(u'quote', u'Zitat', u'documenttype') concept(u'story', u'Geschichte', u'documenttype') concept(u'tip', u'Tipp', u'documenttype') concept(u'usecase', u'Fallbeispiel', u'documenttype') +concept(u'warning', u'Warnung', u'documenttype') # book structure child(u'book', u'section', u'issubtype', usePredicate=u'ispartof') From 12ee37881d68aa86802bd546f485b8dcbfc9af4f Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 22 May 2013 15:08:24 +0200 Subject: [PATCH 10/23] allow suppressing of security propagation via noPropagateSecurity option --- browser/loops.css | 9 +++++++++ browser/skin/loopy/loops.css | 9 +++++++++ security/setter.py | 2 ++ 3 files changed, 20 insertions(+) diff --git a/browser/loops.css b/browser/loops.css index 52b9a53..d6b9acc 100644 --- a/browser/loops.css +++ b/browser/loops.css @@ -59,6 +59,15 @@ textarea { margin-top: 0.5em; } +/* elements taken from blueprint (Lobo) skin */ +.span-1, .span-2, .span-3, .span-4, .span-5, .span-6 {float: left;} +.span-1 {width: 105px;} +.span-2 {width: 230px;} +.span-3 {width: 355px;} +.span-4 {width: 480px;} +.span-5 {width: 605px;} +.span-6 {width: 730px;} + table.listing { margin: 1px; margin-top: 6px; diff --git a/browser/skin/loopy/loops.css b/browser/skin/loopy/loops.css index 62031fa..476954f 100644 --- a/browser/skin/loopy/loops.css +++ b/browser/skin/loopy/loops.css @@ -82,6 +82,15 @@ table { margin-top: 0.5em; } +/* elements taken from blueprint (Lobo) skin */ +.span-1, .span-2, .span-3, .span-4, .span-5, .span-6 {float: left;} +.span-1 {width: 105px;} +.span-2 {width: 230px;} +.span-3 {width: 355px;} +.span-4 {width: 480px;} +.span-5 {width: 605px;} +.span-6 {width: 730px;} + tr.even td { background-color: transparent; } diff --git a/security/setter.py b/security/setter.py index a26be15..82ff200 100644 --- a/security/setter.py +++ b/security/setter.py @@ -231,6 +231,8 @@ class ConceptSecuritySetter(LoopsObjectSecuritySetter): setter.propagateSecurity(revert, updated) def propagateSecurity(self, revert=False, updated=None): + if self.globalOptions('noPropagateSecurity'): + return if updated is None: updated = set() obj = self.baseObject From 45eeac9a4113f37623486c23d7867c97e6ef8805 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 5 Jun 2013 09:15:50 +0200 Subject: [PATCH 11/23] member registration: use info and feedback pages; configurable sender email; login/register portlet --- browser/node_macros.pt | 7 +++++- locales/de/LC_MESSAGES/loops.mo | Bin 24159 -> 24237 bytes locales/de/LC_MESSAGES/loops.po | 7 ++++-- organize/browser/member.py | 20 +++++++++++------ organize/browser/view_macros.pt | 37 +++++++++++++++++++++----------- 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/browser/node_macros.pt b/browser/node_macros.pt index b67f1fb..640f9a1 100644 --- a/browser/node_macros.pt +++ b/browser/node_macros.pt @@ -314,8 +314,13 @@ - + diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index ad3d32055612f5c99ce41d9468b0b9cced058617..89e7e8c8dd3ffa2fd069020eeb9f787eaca30e35 100644 GIT binary patch delta 8836 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 diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 1a93a8d..1885c16 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: 0.13.0\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n" -"PO-Revision-Date: 2013-05-05 12:00 CET\n" +"PO-Revision-Date: 2013-06-05 12:00 CET\n" "Last-Translator: Helmut Merz \n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -762,6 +762,9 @@ msgstr "Teilnehmerregistrierung" msgid "Register" msgstr "Benutzer registrieren" +msgid "Register new member" +msgstr "Neu registrieren" + msgid "Login name already taken." msgstr "Die von Ihnen eingegebene Benutzerkennung ist schon vergeben." @@ -775,7 +778,7 @@ msgid "confirmation_mail_subject" msgstr "Benutzer-Registrierung" msgid "confirmation_mail_text" -msgstr "Bitte clicken Sie auf den folgenden Link, um die Anmeldung abzschließen." +msgstr "Bitte clicken Sie auf den folgenden Link, um die Anmeldung abzuschließen." msgid "The user account has been created." msgstr "Ihr Benutzerkonto wurde eingerichtet." diff --git a/organize/browser/member.py b/organize/browser/member.py index 28e13f0..5916929 100644 --- a/organize/browser/member.py +++ b/organize/browser/member.py @@ -92,6 +92,7 @@ class BaseMemberRegistration(NodeView): label = _(u'Member Registration') label_submit = _(u'Register') + title = _('Member Registration') permissions_key = u'registration.permissions' roles_key = u'registration.roles' @@ -104,6 +105,7 @@ class BaseMemberRegistration(NodeView): isInnerHtml = False showAssignments = False form_action = 'register' + versionInfo = None def closeAction(self, submit=True): return u'' @@ -202,6 +204,7 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm): permissions_key = u'secure_registration.permissions' roles_key = u'secure_registration.roles' + email_key = 'reg_email' @Lazy def schema(self): @@ -265,17 +268,19 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm): baseUrl, userid, id,) recipients = [recipient] subject = _(u'confirmation_mail_subject') - name = '.'.join((self.text_names_prefix, self.feedback_key)) + name = '.'.join((self.text_names_prefix, self.email_key)) text = self.resourceManager.get(name) if text: - message = text.data % url + message = (text.data % url).encode('UTF-8') subject = text.description or subject else: message = _(u'confirmation_mail_text') + u':\n\n' message = (message + url).encode('UTF-8') - sender = 'helmutm@cy55.de' + senderInfo = self.globalOptions('email.sender') + sender = senderInfo and senderInfo[0] or 'info@loops.cy55.de' + sender = sender.encode('UTF-8') msg = MIMEText(message, 'plain', 'utf-8') - msg['Subject'] = subject + msg['Subject'] = subject.encode('UTF-8') msg['From'] = sender msg['To'] = ', '.join(recipients) mailhost = component.getUtility(IMailDelivery, 'Mail') @@ -286,8 +291,9 @@ class ConfirmMemberRegistration(BaseMemberRegistration, Form): permissions_key = u'secure_registration.permissions' roles_key = u'secure_registration.roles' - info_key = 'conf_info' - feedback_key = 'conf_feedback' + info_key = 'confirm_info' + feedback_key = 'confirm_feedback' + email_key = 'confirm_email' form_action = 'confirm_registration' @@ -303,6 +309,8 @@ class ConfirmMemberRegistration(BaseMemberRegistration, Form): @Lazy def schema(self): schema = super(ConfirmMemberRegistration, self).schema + schema.fields.remove('salutation') + schema.fields.remove('academicTitle') schema.fields.remove('birthDate') schema.fields.remove('phoneNumbers') schema.fields.remove('loginName') diff --git a/organize/browser/view_macros.pt b/organize/browser/view_macros.pt index bff4b91..93ef80e 100644 --- a/organize/browser/view_macros.pt +++ b/organize/browser/view_macros.pt @@ -2,25 +2,36 @@ - - + + +
+ +
- - - - -
Login Name -
-
+ +
+ + + + +
Login Name +
+
From 9d3f6a2fb3b4d7593d59faf9f2669786f59659be Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 19 Jun 2013 20:46:25 +0200 Subject: [PATCH 13/23] work in progress: state change dialog --- organize/stateful/browser.py | 59 ++++++++++++++++++++++++++++++-- organize/stateful/configure.zcml | 15 +++++++- organize/stateful/view_macros.pt | 42 +++++++++++++++++++++-- 3 files changed, 109 insertions(+), 7 deletions(-) diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index 42e04a2..98dc3a9 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 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 @@ -26,9 +26,13 @@ from zope.cachedescriptors.property import Lazy from zope.i18n import translate from cybertools.browser.action import Action, actions +from cybertools.composer.schema.field import Field +from cybertools.composer.schema.interfaces import ISchemaFactory +from cybertools.composer.schema.schema import Schema from cybertools.stateful.interfaces import IStateful, IStatesDefinition from loops.browser.common import BaseView from loops.browser.concept import ConceptView +from loops.browser.form import ObjectForm, EditObject from loops.expert.query import And, Or, State, Type, getObjects from loops.expert.browser.search import search_template from loops.security.common import checkPermission @@ -83,16 +87,65 @@ class StateAction(Action): for std in statefulActions: actions.register('state.' + std, 'object', StateAction, - definition = std, + definition=std, cssClass='icon-action', ) +class ChangeStateBase(object): + + @Lazy + def stateful(self): + return component.getAdapter(self.view.context, IStateful, + name=self.definition) + + @Lazy + def definition(self): + return self.request.form.get('stdef') or u'' + + @Lazy + def action(self): + return self.request.form.get('action') or u'' + + @Lazy + def stateObject(self): + return self.stateful.getStateObject() + + +class ChangeStateForm(ObjectForm, ChangeStateBase): + + form_action = 'change_state_action' + data = {} + + @Lazy + def macro(self): + return template.macros['change_state'] + + @Lazy + def schema(self): + # TODO: create schema directly, use field information specified + # in transition + commentsField = Field('comments', u'Comments', 'textarea', + description=u'Enter comments.') + fields = [commentsField] + return Schema(name='change_state', request=self.request, + manager=self, *fields) + #schemaFactory = ISchemaFactory(self.adapted) + #return schemaFactory(self.typeInterface, manager=self, + # request=self.request) + + +class ChangeState(EditObject, ChangeStateBase): + + def update(self): + print '***', self.request.form + return True + + #class StateQuery(ConceptView): class StateQuery(BaseView): template = template - form_action = 'execute_search_action' @Lazy diff --git a/organize/stateful/configure.zcml b/organize/stateful/configure.zcml index 7833208..30ad487 100644 --- a/organize/stateful/configure.zcml +++ b/organize/stateful/configure.zcml @@ -77,7 +77,7 @@ set_schema="cybertools.stateful.interfaces.IStateful" /> - + + + + + diff --git a/organize/stateful/view_macros.pt b/organize/stateful/view_macros.pt index d1be431..e6ce00b 100644 --- a/organize/stateful/view_macros.pt +++ b/organize/stateful/view_macros.pt @@ -68,8 +68,6 @@ - -
Category
+ +
+
+ +
+
+ +
+ + + + +
+ + + + + From 18f794bfe7978771ca64af0250bc9021d42993e9 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 20 Jun 2013 13:32:48 +0200 Subject: [PATCH 14/23] work in progress: form and processing for state transitions --- locales/de/LC_MESSAGES/loops.mo | Bin 24237 -> 24577 bytes locales/de/LC_MESSAGES/loops.po | 22 ++++++++++++++++++++-- organize/stateful/browser.py | 26 +++++++++++++++++--------- organize/stateful/task.py | 1 + organize/stateful/view_macros.pt | 24 ++++++++++++++++++------ 5 files changed, 56 insertions(+), 17 deletions(-) diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 89e7e8c8dd3ffa2fd069020eeb9f787eaca30e35..454e658170da1b4c2b00c65e24c62f9b9deacdba 100644 GIT binary patch delta 9216 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�$Bc zzg951ueNCqj4LkvB<80Ip zEJf|$OL^?SwrnRA8hAfy=0`CIk7I2-jhbjBYJeN4uO#FScf~Qt`{*R%T{so>u6%;p z>Ppl&;r-l+H^vs^Ej<*pf}yA_oq`&;7;E7ov&8O~A$>WUP#yk?+R|%S7whM{D{O}C z$$KMnb>?Cs9>!$+4P((0+uuFo9MnVxqPAutYU`$<23m;fU^!}HyKp3yqmC+SfO~{l z7)(A0_54_?FGekF1=hwgWIT_voq}Gfa#Y8MFc42*D?E*wK=44fT?5o-8iSf>I;wp( z*1=rVP7X)48-wb17OLGs48;=6WPIm&3i?6$4)u~<#Wol^$UVdEs2PvLwpfIk&{ot0 zUa|YTEq~Yi81(~n3^i~i>g%|M`i%Vsll#7Z3hJ;H*27TCo0+XpE9zi*Hmai>Ov60X ziWZ?dUW@Iq4E49=C}vbxs`&p=o8dHU!n#$joOKGsI85>)2&ZL zwQq$X*b#kOkD9=6R6hl%uW20WbDW5JNf)Dze9fKgzZ!0^8{1JY(_ZY2Cs8{SJ=FaP zO+p<-7OI23sQW`u1K*A6Zxr%DI1{lO?n5o;FVsW>hPgjbc#hjt`=a?gP|We{G&ay(7P(CVbWEs|K7khLc}JtvrCAH%%Z2wX#@Lhs{yiIIO-;UY|FKR;jQ3D=9eN7b@hQW7p)cXG8 zDd;TPqdFRc>UbLJ!C9z@EJ1DMYShX%q95K*@P#^aNsi&;_#do_ebnHV>pJBJZ^<>j z^EW|X&KY7pkw&EOAV==|E0s_ADat*pvusoEg|6mA1~Hg=y}UQC67sRuHkZn8iABWN zn+_PI}ol>M7(!it97No_ zI#L%*=nBISBFjykg_OUsvbdN0H5Kqt;t@Z0e5VnKu9oKOlpiAAA^KAHFzUMB?oY!1 zlK<(eJ`Xi!i zvOTno@>yaX(aq`}!vo~q3H|NR|BBv__=@rdVhvH1&{ayLbMG-sC3X{SbpBnaY(ZpG zj=*sI~$-!CZ*r~Ykxz-m`xed0mtCt^$DIC1Oc`Gsr@4fOvS zyPfDm-W1ysT`33PRAL-)5Al~h{WIo~>-q<=pZJ>SOx+Z`3!{kklyAN6BH2L%a<8?1 ze>RewCmIqB2wjV~xz8;+_u$J!DRn2XE@B8FCi zh$X~l#O=g%+BL$VsB69cVSMKlF^9@as<7)m>`C2J%OkO`mGg1Fb)u?&6WvtcT4DA6 zZt7HGI+0-YC$0VsY(?F$M<`q%zPB46O7r-nK*X u{k=_jp0F|Nj8yoQJ*u diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 1885c16..32535c4 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: 0.13.0\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n" -"PO-Revision-Date: 2013-06-05 12:00 CET\n" +"PO-Revision-Date: 2013-06-20 12:00 CET\n" "Last-Translator: Helmut Merz \n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -1025,14 +1025,26 @@ msgid "Restrict to objects with certain states" msgstr "Auf Objekte mit bestimmtem Status beschränken" msgid "Workflow" -msgstr "Statusdefinition/Workflow" +msgstr "Workflow" msgid "States" msgstr "Statuswerte" +msgid "States Definition" +msgstr "Workflowdefinition" + +msgid "State Transition" +msgstr "Workflow-Statusänderung" + +msgid "Transition" +msgstr "Aktion" + msgid "State information for $definition: $title" msgstr "Status ($definition): $title" +msgid "Available Transitions" +msgstr "Übergänge" + msgid "classification_quality" msgstr "Klassifizierung" @@ -1045,6 +1057,12 @@ msgstr "Aufgabe" msgid "publishable_task" msgstr "Aufgabe/Zugriff" +msgid "label_transition_comments" +msgstr "Bemerkung" + +msgid "desc_transition_comments" +msgstr "Notizen zum Statusübergang." + # state names msgid "accepted" diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index 98dc3a9..130daf4 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -52,7 +52,7 @@ def registerStatesPortlet(controller, view, statesDefs, cm = controller.macros stfs = [component.getAdapter(view.context, IStateful, name=std) for std in statesDefs] - cm.register(region, 'states', title=_(u'States'), + cm.register(region, 'states', title=_(u'Workflow'), subMacro=template.macros['portlet_states'], priority=priority, info=view, stfs=stfs) @@ -81,8 +81,9 @@ class StateAction(Action): @Lazy def icon(self): - icon = self.stateObject.icon or 'led%s.png' % self.stateObject.color - return 'cybertools.icons/' + icon + return self.stateObject.stateIcon + #icon = self.stateObject.icon or 'led%s.png' % self.stateObject.color + #return 'cybertools.icons/' + icon for std in statefulActions: @@ -96,7 +97,7 @@ class ChangeStateBase(object): @Lazy def stateful(self): - return component.getAdapter(self.view.context, IStateful, + return component.getAdapter(self.view.virtualTargetObject, IStateful, name=self.definition) @Lazy @@ -107,6 +108,10 @@ class ChangeStateBase(object): def action(self): return self.request.form.get('action') or u'' + @Lazy + def transition(self): + return self.stateful.getStatesDefinition().transitions[self.action] + @Lazy def stateObject(self): return self.stateful.getStateObject() @@ -121,24 +126,27 @@ class ChangeStateForm(ObjectForm, ChangeStateBase): def macro(self): return template.macros['change_state'] + @Lazy + def title(self): + return self.virtualTargetObject.title + @Lazy def schema(self): # TODO: create schema directly, use field information specified # in transition - commentsField = Field('comments', u'Comments', 'textarea', - description=u'Enter comments.') + commentsField = Field('comments', _(u'label_transition_comments'), + 'textarea', + description=_(u'desc_transition_comments')) fields = [commentsField] return Schema(name='change_state', request=self.request, manager=self, *fields) - #schemaFactory = ISchemaFactory(self.adapted) - #return schemaFactory(self.typeInterface, manager=self, - # request=self.request) class ChangeState(EditObject, ChangeStateBase): def update(self): print '***', self.request.form + self.stateful.doTransition(self.action) return True diff --git a/organize/stateful/task.py b/organize/stateful/task.py index 0721bc4..5e60ee5 100644 --- a/organize/stateful/task.py +++ b/organize/stateful/task.py @@ -59,6 +59,7 @@ def taskStates(): Transition('finish', 'finish', 'finished'), Transition('cancel', 'cancel', 'cancelled'), Transition('reopen', 're-open', 'draft'), + Transition('archive', 'archive', 'archived'), initialState='draft') diff --git a/organize/stateful/view_macros.pt b/organize/stateful/view_macros.pt index e6ce00b..1d30d3d 100644 --- a/organize/stateful/view_macros.pt +++ b/organize/stateful/view_macros.pt @@ -71,7 +71,7 @@
- Workflow + States Definition
@@ -79,9 +79,10 @@ State: +
-
-
Available Transitions:
+
Available Transitions: