21 _ = unicode |
21 _ = unicode |
22 |
22 |
23 from logilab.mtconverter import xml_escape |
23 from logilab.mtconverter import xml_escape |
24 from logilab.common.deprecation import class_renamed |
24 from logilab.common.deprecation import class_renamed |
25 from logilab.common.registry import objectify_predicate |
25 from logilab.common.registry import objectify_predicate |
|
26 from logilab.common.decorators import classproperty |
26 |
27 |
27 from cubicweb.predicates import match_kwargs, no_cnx, anonymous_user |
28 from cubicweb.predicates import match_kwargs, no_cnx, anonymous_user |
28 from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW, StartupView |
29 from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW, StartupView |
29 from cubicweb.utils import UStringIO |
30 from cubicweb.utils import UStringIO |
30 from cubicweb.schema import display_name |
31 from cubicweb.schema import display_name |
415 self.w(u'<div id="contentfooter">') |
416 self.w(u'<div id="contentfooter">') |
416 for comp in components: |
417 for comp in components: |
417 comp.render(w=self.w, view=view) |
418 comp.render(w=self.w, view=view) |
418 self.w(u'</div>') |
419 self.w(u'</div>') |
419 |
420 |
420 |
421 class BaseLogForm(forms.FieldsForm): |
421 class LogForm(forms.FieldsForm): |
422 """Abstract Base login form to be used by any login form |
|
423 """ |
|
424 __abstract__ = True |
|
425 |
422 __regid__ = 'logform' |
426 __regid__ = 'logform' |
423 domid = 'loginForm' |
427 domid = 'loginForm' |
424 needs_css = ('cubicweb.login.css',) |
428 needs_css = ('cubicweb.login.css',) |
425 onclick = "javascript: cw.htmlhelpers.popupLoginBox('%s', '%s');" |
429 |
|
430 onclick_base = "javascript: cw.htmlhelpers.popupLoginBox('%s', '%s');" |
|
431 onclick_args = (None, None) |
|
432 |
|
433 @classproperty |
|
434 def form_buttons(cls): |
|
435 # we use a property because sub class will need to define their own onclick_args. |
|
436 # Therefor we can't juste make the string formating when instanciating this class |
|
437 onclick = cls.onclick_base % cls.onclick_args |
|
438 form_buttons = [fw.SubmitButton(label=_('log in'), |
|
439 attrs={'class': 'loginButton'}), |
|
440 fw.ResetButton(label=_('cancel'), |
|
441 attrs={'class': 'loginButton', |
|
442 'onclick': onclick}),] |
|
443 ## Can't shortcut next access because __dict__ is a "dictproxy" which |
|
444 ## does not support items assignement. |
|
445 # cls.__dict__['form_buttons'] = form_buttons |
|
446 return form_buttons |
|
447 |
|
448 def form_action(self): |
|
449 if self.action is None: |
|
450 return login_form_url(self._cw) |
|
451 return super(LogForm, self).form_action() |
|
452 |
|
453 class LogForm(BaseLogForm): |
|
454 """Simple login form that send username and password |
|
455 """ |
|
456 __regid__ = 'logform' |
|
457 domid = 'loginForm' |
|
458 needs_css = ('cubicweb.login.css',) |
426 # XXX have to recall fields name since python is mangling __login/__password |
459 # XXX have to recall fields name since python is mangling __login/__password |
427 __login = ff.StringField('__login', widget=fw.TextInput({'class': 'data'})) |
460 __login = ff.StringField('__login', widget=fw.TextInput({'class': 'data'})) |
428 __password = ff.StringField('__password', label=_('password'), |
461 __password = ff.StringField('__password', label=_('password'), |
429 widget=fw.PasswordSingleInput({'class': 'data'})) |
462 widget=fw.PasswordSingleInput({'class': 'data'})) |
430 form_buttons = [fw.SubmitButton(label=_('log in'), |
463 |
431 attrs={'class': 'loginButton'}), |
464 onclick_args = ('popupLoginBox', '__login') |
432 fw.ResetButton(label=_('cancel'), |
|
433 attrs={'class': 'loginButton', |
|
434 'onclick': onclick % ('popupLoginBox', '__login')}),] |
|
435 |
|
436 def form_action(self): |
|
437 if self.action is None: |
|
438 return login_form_url(self._cw) |
|
439 return super(LogForm, self).form_action() |
|
440 |
465 |
441 |
466 |
442 class LogFormView(View): |
467 class LogFormView(View): |
443 # XXX an awfull lot of hardcoded assumptions there |
468 # XXX an awfull lot of hardcoded assumptions there |
444 # makes it unobvious to reuse/specialize |
469 # makes it unobvious to reuse/specialize |