class SiteUserResetPwStepTwoView(user_defined_mixin(), SiteUserMixIn, View): """丢失密码重置第二步,填写新密码""" def __init__(self, **kwargs): self.tpl = self.reset_passwd_template self.ctx_getter = self.get_reset_passwd_context self.ctx = self._reset_passwd_default_ctx() self.ctx['step2'] = True super(SiteUserResetPwStepTwoView, self).__init__(**kwargs) def get(self, request, *args, **kwargs): token = kwargs['token'] try: self.uid = signing.loads(token, key=self.sign_key, max_age=self.reset_passwd_link_expired_in*3600) except signing.SignatureExpired: # 通过context来控制到底显示表单还是过期信息 self.ctx['expired'] = True except signing.BadSignature: raise Http404 return super(SiteUserResetPwStepTwoView, self).get(request, *args, **kwargs) @inner_account_http_guard def post(self, request, *args, **kwargs): password = request.POST.get('password', None) password1 = request.POST.get('password1', None) if not password or not password1: raise InnerAccoutError('请填写密码') if password != password1: raise InnerAccoutError('两次密码不一致') uid = signing.loads(kwargs['token'], key=self.sign_key) password = make_password(password) InnerUser.objects.filter(user_id=uid).update(passwd=password) return HttpResponseRedirect(reverse('siteuser_reset_step2_done'))
class SiteUserResetPwStepOneView(user_defined_mixin(), SiteUserMixIn, View): """丢失密码重置第一步,填写注册时的电子邮件""" def __init__(self, **kwargs): self.tpl = self.reset_passwd_template self.ctx_getter = self.get_reset_passwd_context self.ctx = self._reset_passwd_default_ctx() self.ctx['step1'] = True super(SiteUserResetPwStepOneView, self).__init__(**kwargs) @inner_account_http_guard def post(self, request, *args, **kwargs): email = request.POST.get('email', None) if not email: raise InnerAccoutError('请填写电子邮件') if EMAIL_PATTERN.search(email) is None: raise InnerAccoutError('电子邮件格式不正确') try: user = InnerUser.objects.get(email=email) except InnerUser.DoesNotExist: raise InnerAccoutError('请填写您注册时的电子邮件地址') token = signing.dumps(user.user.id, key=self.sign_key) link = reverse('siteuser_reset_step2', kwargs={'token': token}) link = request.build_absolute_uri(link) context = { 'hour': self.reset_passwd_link_expired_in, 'link': link } body = loader.render_to_string(self.reset_passwd_email_template, context) # 异步发送邮件 body = unicode(body) send_mail.delay(email, self.reset_passwd_email_title, body) return HttpResponseRedirect(reverse('siteuser_reset_step1_done'))
class SiteUserLoginView(user_defined_mixin(), SiteUserMixIn, View): """登录""" def __init__(self, **kwargs): self.tpl = self.login_template self.ctx_getter = self.get_login_context super(SiteUserLoginView, self).__init__(**kwargs) def get_login_context(self, request): """注册和登录都是通过ajax进行的,这里渲染表单模板的时候传入referer, 当ajax post返回成功标识的时候,js就到此referer的页面。 以此来完成注册/登录完毕后自动回到上个页面 """ ctx = super(SiteUserLoginView, self).get_login_context(request) ctx['referer'] = self._normalize_referer(request) return ctx @inner_account_ajax_guard def post(self, request, *args, **kwargs): email = request.POST.get('email', None) passwd = request.POST.get('passwd', None) if not email or not passwd: raise InnerAccoutError('请填写email和密码') try: user = InnerUser.objects.get(email=email) except InnerUser.DoesNotExist: raise InnerAccoutError('用户不存在') if user.passwd != hashlib.sha1(passwd).hexdigest(): raise InnerAccoutError('密码错误') request.session['uid'] = user.user.id
class SiteUserResetPwStepTwoDoneView(user_defined_mixin(), SiteUserMixIn, View): """重置完成""" def __init__(self, **kwargs): self.tpl = self.reset_passwd_template self.ctx_getter = self.get_reset_passwd_context self.ctx = self._reset_passwd_default_ctx() self.ctx['step2_done'] = True super(SiteUserResetPwStepTwoDoneView, self).__init__(**kwargs)
class SiteUserChangePwDoneView(user_defined_mixin(), SiteUserMixIn, View): """已登录用户修改密码成功""" def get(self, request, *args, **kwargs): if request.siteuser: return HttpResponseRedirect('/') ctx = self.get_change_passwd_context(request) ctx['done'] = True return render_to_response(self.change_passwd_template, ctx, context_instance=RequestContext(request))
class SiteUserRegisterView(user_defined_mixin(), SiteUserMixIn, View): """注册""" def __init__(self, **kwargs): self.tpl = self.register_template self.ctx_getter = self.get_register_context super(SiteUserRegisterView, self).__init__(**kwargs) def get_register_context(self, request): ctx = super(SiteUserRegisterView, self).get_register_context(request) ctx['referer'] = self._normalize_referer(request) return ctx @inner_account_ajax_guard def post(self, request, *args, **kwargs): if not request.merchant: return HttpResponseRedirect('/mobile/error/' + 'error01') email = request.POST.get('email', None) username = request.POST.get('username', None) passwd = request.POST.get('passwd', None) phone = request.POST.get('phone', None) if not email or not username or not passwd: raise InnerAccoutError('请完整填写注册信息') if len(email) > MAX_EMAIL_LENGTH: raise InnerAccoutError('电子邮件地址太长') if EMAIL_PATTERN.search(email) is None: raise InnerAccoutError('电子邮件格式不正确') if InnerUser.objects.filter(email=email).exists(): raise InnerAccoutError('此电子邮件已被占用') if len(username) > MAX_USERNAME_LENGTH: raise InnerAccoutError( '用户名太长,不要超过{0}个字符'.format(MAX_USERNAME_LENGTH)) if SiteUser.objects.filter(username=username).exists(): raise InnerAccoutError('用户名已存在') passwd = make_password(passwd) user = InnerUser.objects.create(email=email, passwd=passwd, username=username, mid=request.merchant, phone=phone) request.session['uid'] = user.user.id
class SiteUserChangePwView(user_defined_mixin(), SiteUserMixIn, View): """已登录用户修改密码""" def render_to_response(self, request, **kwargs): ctx = self.get_change_passwd_context(request) ctx['done'] = False ctx.update(kwargs) return render_to_response( self.change_passwd_template, ctx, context_instance=RequestContext(request) ) def get(self, request, *args, **kwargs): if not request.siteuser: return HttpResponseRedirect('/') if not request.siteuser.is_active or request.siteuser.is_social: return HttpResponseRedirect('/') return self.render_to_response(request) def post(self, request, *args, **kwargs): if not request.siteuser: return HttpResponseRedirect('/') if not request.siteuser.is_active or request.siteuser.is_social: return HttpResponseRedirect('/') password = request.POST.get('password', None) password1 = request.POST.get('password1', None) if not password or not password1: return self.render_to_response(request, error_msg='请填写新密码') if password != password1: return self.render_to_response(request, error_msg='两次密码不一致') password = make_password(password) if request.siteuser.inner_user.passwd == password: return self.render_to_response(request, error_msg='不能与旧密码相同') InnerUser.objects.filter(user_id=request.siteuser.id).update(passwd=password) # 清除登录状态 try: del request.session['uid'] except: pass return HttpResponseRedirect(reverse('siteuser_changepw_done'))
[谁]在[哪个条目/帖子]中回复了你 因为在生成的通知里有 [谁] 这个用户链接,所以用户必须自己在settings.py中定义 USER_LINK 这个方法,它接受一个参数:用户id,然后返回用户个人页面的url 有两种方式获取通知: 1. GET /notifies.json/ 返回的是未读的通知,只要用js将返回的html组织在合适dom元素中即可 2. GET /notifies/ 用一个页面来展示全部的通知。包括已经处理过的通知 所以就必须设置 SITEUSER_ACCOUNT_MIXIN, 在其中指定 notify_template 点击一个未读的通知: GET /notify/confirm/<notify_id>/ 如果正确,就会跳转到相应的页面 """ user_define = load_user_define.user_defined_mixin()() notify_template = getattr(user_define, 'notify_template', None) if not notify_template: raise ImproperlyConfigured('SITEUSER_ACCOUNT_MIXIN has no attribute "notify_template"') get_notify_context = getattr(user_define, 'get_notify_context', None) if not get_notify_context: get_notify_context = lambda x: {} def notifies_json(request): """由Ajax获取的未读通知""" user = request.siteuser if not user: return HttpResponse(json.dumps([]), mimetype='application/json') notifies = Notify.objects.filter(user=user, has_read=False).select_related('sender').order_by('-notify_at')