From 9427b8ccbd74d561b451b41f6fca596cd1d4bea0 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 6 May 2013 08:00:09 +0200 Subject: [PATCH] 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 zcmYk=3w+J@{m1cNBoT255eLUv(*r(6$?f1R^a@sBZeZ-Fa z5$@UesI?Bynh3{fi3jRCPD(AunVO_h$2pPaIHU1H?0~IXJ5FsJX^zJj@>4Mqi?JS- zVgn3fDn5ygunJ?b8X3xU-t-dAA5k6r1=Yc4R(=r^$$yJYv2Gi$<1|!9ol*6L4=Rt8ai>aVo0A9Mr%= zuo+H9^%FoXY!Ry68e|ilt*FyIf^HKM=Sb+qA5a}P%9K!jtVV58=I3~ zj9T$as59S#aricB0mo4j`3yDDudoH)%HaGpV2ey|MqN-7$w!qJqF#6$HPIEQnQun! zqqE=2Yf$a4VG7o1=S?UB^?ojLn$8H+C7y*^(2MQZ{}>XxD5!&bQ3D*b{HGX2{ygdk zE@32Iv-_p(apc<^RCCb?Ihd zG%mq<_$+E-8&F%h#oU2$EB_q3qK;}S>ZtajR(=fi-WjXEg4)4aoxBAlp^h*U^>y8iYCjTPRTNsqEUZs{ zDK@}$sN1>)wSqTMD>#H&;V}$vG1eph32Fx}n3qvIbOY7jPnNIWnJI85*A_0!!Yp$2_WGaGId1*jE0j5@QqR=yIo#p^9!g_`KAmj4K~iw@#NBA9T zBFTJf+7TaW0vV{S@9LGiP9G9k6bwWSJkzUif>?|EeAE^%u=>TAKz;>kfK8~5x1t8x zgBoBjYG>cYyYU1z#+V$h-z3cD{y8m4Xbba^-Ejgq8n>c$=6lr7W<0%Ug*m7J`l1HR z!zMTi^)(b*d8t{Bns5+xBuh{WTZ=LJ{@0TTuLKjxZ$&lSk7{_t>W`v!;solm{1~~X z&Q&XK-NTzmd(;H`p(dP<>VGV%ze%V&GzHzkB>W_}n9i%H71f|#Jdb+uYt+Q9qB@T0 z>D9-hwm2C(Viu<21k_Q^LG`o1@=u}e&@-r=+SHT%*NV1S!|m4acc>X2Kn;8to8lSN z1inFa{1a-zF}dD=4X_XSCa8YzN41-bI{PA2zm=AEbJ_n!6s)E|-*Xiz|69wyhuVRU zPy>C8TG?6DN-m%VxQ@C55xu;Anxg76Q2phi`pLKQQK$(Oy4E0Q1&dKDd>%DmmAMTy z&`#6@_M%q!7OLaJs5^5M!xKeq@mVWBhiZ2j_1?Fp`yWe0-Q&%)K5C0nPz^K9&Q{+8 zHIZSciHt!V(Iiy+a;u+XdDnazHG!3=m9IhWj_dr2g#OUHX1-^hG`~Q-a0T_9*Xr%9 zG!8Y9WYk33q6X-Iy(0KBa1i-NxDdSR>_+X-*QoY4u#Ucer?1y>ENUf*n1UTJ8}qOk z&P8qMO4NiysPrt1h3bixUI33?ctvvN!@AE81-KhYo-vyR`8eN^)b0l4)0c`%w#etUvqTg2WOlc-b26 zN1gd`^K z+QOr#7cQZ;C~~m(>zIta$PY$ct|w4Ov<9`sFQQhu4Wsc0>WGe`7IGRR@jU9ii>QUU zS4ilyh#2Bs!Z_5OXoc!H1J%J@=)-;(jSrzFIK%3Hfoi`3wNuZd4|kvzbll3nL><8` ze8(lBtq6q+_%TAA@f)a1^(n^SRgA(L=1<7Kk2;Zg-io@R1{{L5af;;&QD4nm zR6h$*JGC4W7~fe(LRc#O^S!fdf%=2g#_Wo%$@j-} zEXF#x4Aoxu+-vqU_%~5CD1$86? zaSl#HE#Ne2>o1@#@xO<&|N2}S-shcZHmai`sI#1gTG?Z$qj0T$oz?F|eLV+J1D`=% z*2}0JxQSY^Z-lpFnW%v~qZT@F1p8l~#83(v;5gJw3sDmYpzg*Z)QZ<4_sn?#r{a0k zUAcFpx7CHHqgjHQ_$usx8&L~5irUe0sByn?Nz^5A-HaUNHHbrsoMxyFXP~yU92??N z)C&IxyW;_5F3weKhy6x-KVGHShWt9Lhxb(yv|0!xkSFi!zL=9B$e(x@|M)lVbHIW|JiSeC*Bs6dUb?N4#23Ule z;Re(Tn=uY|ptkS;s@?mjjz2@S`#Z+tHSCSiW9>Hrb+@MCT^PhPegD5Ap&1{+uJ~uv zgkr~e6KIU8Z*KVvGaL1XsXJ=mF{nH8AnNliviuBGe~)4U1}(ot>ib_sLMvKt6`N5V zy@EY(7ivWpQ62w?-SH;sN2Tj{@3&zLvS?=oX5n8k9b+eWJJcC9PA^pd1JTu1&dK0RHov8XZPy-)Cb@(1~(Vb&B09#J-Rx};85I^b}akHX|QE?Z`6J z!Zx4=-iDgcUe_uPp;mGdwc^Cd-UL!mD{qGypaV9-92|s0P%B)Hop2qh?WbJI)EDZ9aKlhP?zrnYGUV59eio|tEdTGM-33m-(#7Cnot&M$9kZS zqCe{B9g`zi3o&plTzIpQn#N{sw35er=i)+p8qXnjXnSJFkq+m!!@c$4@Ov6k3Mj3I{px4r9Zrl74A)I$B7EGNoH{~1RTdZNi^ zTD$({1l&ZO*4xR-4v{`g+(Z6nRz^1b-&()CBR@Qx=71izLj7_6f*3)>Qq~PWC-gjF zZImu19l#%nYlIG`ig=FDqYt@|s874QiJPR8i8+LxwjR!9>~)`YyqnB1Vk!Aqgx|{5 zb`7z}@*PMYAX<^H#GhjY>KPGAOHP>i3?G75>Ag!+=o>)%Vm-@!_@KA@_K^gyAv~s6k-cy3o-oQ=-X)ug2Z)V2xW^<-~I1yZ~rO^LC1zVb5m%G%gZ~#wOG!vdAoV>ZFA(hrKQV~- zIy53BIbuMlETzquugG5@me6)Aq2~|84q`F+f8jZz2N6epF6z0@BmB>Y?7a|<3)Q4F z%Wi5Vy{Pw*K4`6d_yoaET=;3pKXXE9tr8N)&`LiFZxJ&{{|#@1@>+GsK0`{+BSiaf z%KPKIi*!0I-@~KCFw)^j zkHmMxAj)Q9d+Tc$={uh$Ub%PIKA|Rss7v7-B1HN%q8aIy#3MvUqA#Im4^csSq~$a4 zamuEtl4l%ILRkyU#j_ZJeX*FBOS+PHFoKWv?-VR0^c!&dX-B1=6@>nx%(MJ2$@e7k ziN``$Q!`^vlKLz0aVX7~kiDH$2ikswM~KrzXW|5*=L+#GQAnGtP=PPO{fykb+2b`&}96BEhD;LlaSGmF?sj3OSO?qU3v(DNJq z?*ivR5=lg3Dw|tpT`-Qa4~Zugp`^6rvSdm(lGF18@lT>L(VQ4c=vhVVCGMha527FG z{lpaFRbo0ZoOqqkGmtiSKC8)(s(vx8QN5)5DoV=AedPr+{l0=n1O9^IdA?x5BmVME z)!RFch)OQ12n75^L0_=c?<*@WE-NYs`ip)3K%gQ}eYwl)Q9i$~a<)I8_Y4 zpr85vvXUTWL;R(W`UBPLMpZ_q=amNj+i^vCu);UDGEnUI1`c=Q4|b}qJKl}?e@}zX 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)