class ChangePassword(dd.Action): """Dialog action to change the password of a user. """ label = _("Change password") parameters = dict(current=dd.PasswordField(_("Current password"), blank=True), new1=dd.PasswordField(_("New password"), blank=True), new2=dd.PasswordField(_("New password again"), blank=True)) params_layout = """ current new1 new2 """ def run_from_ui(self, ar, **kw): pv = ar.action_param_values if pv.new1 != pv.new2: ar.error("New passwords didn't match!") return count = 0 for obj in ar.selected_rows: if not obj.has_usable_password() \ or obj.check_password(pv.current): obj.set_password(pv.new1) obj.full_clean() obj.save() count += 1 else: ar.info("Incorrect current password for %s." % obj) msg = _("New password has been set for %d users.") % count ar.success(msg, alert=True)
class ChangePassword(dd.Action): # button_text = u"\u205C" # DOTTED CROSS (⁜) # button_text = u"\u2042" # ASTERISM (⁂) button_text = u"\u2731" # 'HEAVY ASTERISK' (✱) # icon_name = "disk" label = _("Change password") parameters = dict( current=dd.PasswordField(_("Current password"), blank=True), new1=dd.PasswordField(_("New password"), blank=True), new2=dd.PasswordField(_("New password again"), blank=True) ) params_layout = """ current new1 new2 """ # def get_action_permission(self, ar, obj, state): # user = ar.get_user() # # print("20160825", obj, user) # if obj.id != user.id and \ # not user.user_type.has_required_roles([SiteAdmin]): # return False # return super( # ChangePassword, self).get_action_permission(ar, obj, state) def run_from_ui(self, ar, **kw): pv = ar.action_param_values if pv.new1 != pv.new2: ar.error("New passwords didn't match!") return done_for = [] for obj in ar.selected_rows: if ar.get_user().user_type.has_required_roles([SiteAdmin]) \ or not obj.has_usable_password() \ or obj.check_password(pv.current): obj.set_password(pv.new1) obj.full_clean() obj.save() done_for.append(str(obj)) else: ar.info("Incorrect current password for %s." % obj) if ar.request is not None: auth.login(ar.request, obj) msg = _("New password has been set for {}.").format( ', '.join(done_for)) ar.success(msg, alert=True)
class SignIn(dd.Action): label = _("Sign in") select_rows = False parameters = dict(username=dd.CharField(_("Username")), password=dd.PasswordField(_("Password"), blank=True)) # params_layout = dd.ActionParamsLayout(""" params_layout = dd.Panel(""" username password """, label_align=layouts.LABEL_ALIGN_LEFT) http_method = "POST" def run_from_ui(self, ar, **kw): pv = ar.action_param_values user = auth.authenticate(ar.request, username=pv.username, password=pv.password) if user is None: ar.error(_("Failed to log in as {}.".format(pv.username))) else: # user.is_authenticated: auth.login(ar.request, user) ar.success(_("Now logged in as {}").format(user), close_window=True, goto_url=ar.renderer.front_end.build_plain_url())
class RemoteCalendar(mixins.Sequenced): class Meta: app_label = 'cal' abstract = dd.is_abstract_model(__name__, 'RemoteCalendar') verbose_name = _("Remote Calendar") verbose_name_plural = _("Remote Calendars") ordering = ['seqno'] type = models.CharField(_("Type"), max_length=20, default='local', choices=CALENDAR_CHOICES) url_template = models.CharField(_("URL template"), max_length=200, blank=True) # ,null=True) username = models.CharField(_("Username"), max_length=200, blank=True) # ,null=True) password = dd.PasswordField(_("Password"), max_length=200, blank=True) # ,null=True) readonly = models.BooleanField(_("read-only"), default=False) def get_url(self): if self.url_template: return self.url_template % dict( username=self.username, password=self.password) return '' def save(self, *args, **kw): ct = CALENDAR_DICT.get(self.type) ct.validate_calendar(self) super(RemoteCalendar, self).save(*args, **kw)
class SignInWithSocialAuth(SignIn): # 20171207 nice as an example of a action dialog window with a # HtmlBox, but we don't currently use it. parameters = dict( social_auth_links=dd.HtmlBox( # _("Other authentications"), default=E.div(*settings.SITE.get_social_auth_links())), # social_auth_links=dd.Constant( # settings.SITE.get_social_auth_links), # social=social_auth_field(), username=dd.CharField(_("Username")), password=dd.PasswordField(_("Password"), blank=True) ) # params_layout = dd.ActionParamsLayout(""" params_layout = dd.Panel(""" username password social_auth_links """, label_align="left", window_size=(60,10))
class RemoteCalendar(mixins.Sequenced): """ Remote calendars will be synchronized by :mod:`lino_xl.lib.cal.management.commands.watch_calendars`, and local modifications will be sent back to the remote calendar. """ class Meta: app_label = 'cal' abstract = dd.is_abstract_model(__name__, 'RemoteCalendar') verbose_name = _("Remote Calendar") verbose_name_plural = _("Remote Calendars") ordering = ['seqno'] type = models.CharField(_("Type"), max_length=20, default='local', choices=CALENDAR_CHOICES) url_template = models.CharField(_("URL template"), max_length=200, blank=True) # ,null=True) username = models.CharField(_("Username"), max_length=200, blank=True) # ,null=True) password = dd.PasswordField(_("Password"), max_length=200, blank=True) # ,null=True) readonly = models.BooleanField(_("read-only"), default=False) def get_url(self): if self.url_template: return self.url_template % dict( username=self.username, password=self.password) return '' def save(self, *args, **kw): ct = CALENDAR_DICT.get(self.type) ct.validate_calendar(self) super(RemoteCalendar, self).save(*args, **kw)
class ChangePassword(dd.Action): """Change the password of this user. .. attribute:: current The current password. Leave empty if the user has no password yet. And SiteAdmin users don't need to specify this at all. .. attribute:: new1 The new password. .. attribute:: new2 The new password a second time. Both passwords must match. """ # button_text = u"\u205C" # DOTTED CROSS (⁜) # button_text = u"\u2042" # ASTERISM (⁂) button_text = u"\u2731" # 'HEAVY ASTERISK' (✱) # icon_name = "disk" label = _("Change password") parameters = dict(current=dd.PasswordField(_("Current password"), blank=True), new1=dd.PasswordField(_("New password"), blank=True), new2=dd.PasswordField(_("New password again"), blank=True)) params_layout = """ current new1 new2 """ def get_action_permission(self, ar, obj, state): user = ar.get_user() # print("20160825", obj, user) if obj != user and \ not user.profile.has_required_roles([SiteAdmin]): return False return super(ChangePassword, self).get_action_permission(ar, obj, state) def run_from_ui(self, ar, **kw): pv = ar.action_param_values if pv.new1 != pv.new2: ar.error("New passwords didn't match!") return done_for = [] for obj in ar.selected_rows: if ar.get_user().profile.has_required_roles([SiteAdmin]) \ or not obj.has_usable_password() \ or obj.check_password(pv.current): obj.set_password(pv.new1) obj.full_clean() obj.save() done_for.append(str(obj)) else: ar.info("Incorrect current password for %s." % obj) msg = _("New password has been set for {}.").format( ', '.join(done_for)) ar.success(msg, alert=True)