예제 #1
0
 def get_related_passwords(self, db_field=False):
     related = [
         self.main_systemuser,
     ]
     for model, key, related_kwargs, __ in settings.ACCOUNTS_CREATE_RELATED:
         if 'password' not in related_kwargs:
             continue
         model = apps.get_model(model)
         kwargs = {key: eval(related_kwargs[key], {'account': self})}
         try:
             rel = model.objects.get(account=self, **kwargs)
         except model.DoesNotExist:
             continue
         if db_field:
             if not has_db_field(rel, 'password'):
                 continue
         related.append(rel)
     return related
예제 #2
0
 def get_related_passwords(self, db_field=False):
     related = [
         self.main_systemuser,
     ]
     for model, key, related_kwargs, __ in settings.ACCOUNTS_CREATE_RELATED:
         if 'password' not in related_kwargs:
             continue
         model = apps.get_model(model)
         kwargs = {
             key: eval(related_kwargs[key], {'account': self})
         }
         try:
             rel = model.objects.get(account=self, **kwargs)
         except model.DoesNotExist:
             continue
         if db_field:
             if not has_db_field(rel, 'password'):
                 continue
         related.append(rel)
     return related
예제 #3
0
    def change_password(self, request, id, form_url=''):
        if not self.has_change_permission(request):
            raise PermissionDenied
        # TODO use this insetad of self.get_object(), in other places
        obj = get_object_or_404(self.get_queryset(request), pk=id)
        raw = request.GET.get('raw', '0') == '1'
        can_raw = has_db_field(obj, 'password')
        if raw and not can_raw:
            raise TypeError(
                "%s has no password db field for raw password edditing." % obj)
        related = []
        for obj_name_attr in ('username', 'name', 'hostname'):
            try:
                obj_name = getattr(obj, obj_name_attr)
            except AttributeError:
                pass
            else:
                break
        if hasattr(obj, 'account'):
            account = obj.account
            if obj.account.username == obj_name:
                related.append(obj.account)
        else:
            account = obj
        if account.username == obj_name:
            for rel in account.get_related_passwords(db_field=raw):
                if not isinstance(obj, type(rel)):
                    related.append(rel)

        if request.method == 'POST':
            form = self.change_password_form(obj,
                                             request.POST,
                                             related=related,
                                             raw=raw)
            if form.is_valid():
                form.save()
                self.log_change(request, obj, _("Password changed."))
                msg = _('Password changed successfully.')
                messages.success(request, msg)
                update_session_auth_hash(request, form.user)  # This is safe
                return HttpResponseRedirect('..')
        else:
            form = self.change_password_form(obj, related=related, raw=raw)

        fieldsets = [
            (obj._meta.verbose_name.capitalize(), {
                'classes': ('wide', ),
                'fields': ('password', ) if raw else
                ('password1', 'password2'),
            }),
        ]
        for ix, rel in enumerate(related):
            fieldsets.append((rel._meta.verbose_name.capitalize(), {
                'classes': ('wide', ),
                'fields': ('password_%i' % ix, ) if raw else
                ('password1_%i' % ix, 'password2_%i' % ix)
            }))

        obj_username = self.get_change_password_username(obj)
        adminForm = admin.helpers.AdminForm(form, fieldsets, {})
        context = {
            'title':
            _('Change password: %s') % obj_username,
            'adminform':
            adminForm,
            'raw':
            raw,
            'can_raw':
            can_raw,
            'errors':
            admin.helpers.AdminErrorList(form, []),
            'form_url':
            form_url,
            'is_popup': (IS_POPUP_VAR in request.POST
                         or IS_POPUP_VAR in request.GET),
            'add':
            True,
            'change':
            False,
            'has_delete_permission':
            False,
            'has_change_permission':
            True,
            'has_absolute_url':
            False,
            'opts':
            self.model._meta,
            'original':
            obj,
            'obj_username':
            obj_username,
            'save_as':
            False,
            'show_save':
            True,
            'password':
            random_ascii(10),
        }
        context.update(admin.site.each_context(request))
        return TemplateResponse(request, self.change_user_password_template,
                                context)
예제 #4
0
 def change_password(self, request, id, form_url=''):
     if not self.has_change_permission(request):
         raise PermissionDenied
     # TODO use this insetad of self.get_object(), in other places
     obj = get_object_or_404(self.get_queryset(request), pk=id)
     raw = request.GET.get('raw', '0') == '1'
     can_raw = has_db_field(obj, 'password')
     if raw and not can_raw:
         raise TypeError("%s has no password db field for raw password edditing." % obj)
     related = []
     for obj_name_attr in ('username', 'name', 'hostname'):
         try:
             obj_name = getattr(obj, obj_name_attr)
         except AttributeError:
             pass
         else:
             break
     if hasattr(obj, 'account'):
         account = obj.account
         if obj.account.username == obj_name:
             related.append(obj.account)
     else:
         account = obj
     if account.username == obj_name:
         for rel in account.get_related_passwords(db_field=raw):
             if not isinstance(obj, type(rel)):
                 related.append(rel)
     
     if request.method == 'POST':
         form = self.change_password_form(obj, request.POST, related=related, raw=raw)
         if form.is_valid():
             form.save()
             self.log_change(request, obj, _("Password changed."))
             msg = _('Password changed successfully.')
             messages.success(request, msg)
             update_session_auth_hash(request, form.user) # This is safe
             return HttpResponseRedirect('..')
     else:
         form = self.change_password_form(obj, related=related, raw=raw)
     
     fieldsets = [
         (obj._meta.verbose_name.capitalize(), {
             'classes': ('wide',),
             'fields': ('password',) if raw else ('password1', 'password2'),
         }),
     ]
     for ix, rel in enumerate(related):
         fieldsets.append((rel._meta.verbose_name.capitalize(), {
             'classes': ('wide',),
             'fields': ('password_%i' % ix,) if raw else ('password1_%i' % ix, 'password2_%i' % ix)
         }))
     
     obj_username = self.get_change_password_username(obj)
     adminForm = admin.helpers.AdminForm(form, fieldsets, {})
     context = {
         'title': _('Change password: %s') % obj_username,
         'adminform': adminForm,
         'raw': raw,
         'can_raw': can_raw,
         'errors': admin.helpers.AdminErrorList(form, []),
         'form_url': form_url,
         'is_popup': (IS_POPUP_VAR in request.POST or
                      IS_POPUP_VAR in request.GET),
         'add': True,
         'change': False,
         'has_delete_permission': False,
         'has_change_permission': True,
         'has_absolute_url': False,
         'opts': self.model._meta,
         'original': obj,
         'obj_username': obj_username,
         'save_as': False,
         'show_save': True,
         'password': random_ascii(10),
     }
     context.update(admin.site.each_context(request))
     return TemplateResponse(request, self.change_user_password_template, context)