def info(login): try: user = User('login', login) except UserNotFound: raise NotFound try: data = users.info(user) except SubscribeError: raise Forbidden data['login'] = login try: data['created'] = timestamp(data['created']) except (KeyError, AttributeError): pass try: data['birthdate'] = timestamp(data['birthdate']) except (KeyError, AttributeError): pass if env.user.id: data['subscribed'] = user.check_subscriber(env.user) data['rec_sub'] = user.check_rec_subscriber(env.user) if not data['subscribed']: data['bl'] = env.user.check_blacklist(user) if not data['bl']: data['wl'] = env.user.check_blacklist(user) return Response(json.dumps(data), mimetype='application/json')
def messages_new(page=1): try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit plist = posts.private_unread(offset=offset, limit=settings.page_limit + 1) if not plist and page == 1: return Response(redirect='%s://%s/messages/incoming' % \ (env.request.protocol, settings.domain)) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') return render('/messages/index.html', section='messages', posts=plist, page=page)
def comments(page=1, unread=False): if not env.owner or env.owner.id != env.user.id: return Response(redirect='%s://%s.%s%s' % \ (env.request.protocol, env.user.login.lower(), settings.domain, env.request.path)) try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit plist = posts.recent_commented_posts(unread=unread, offset=offset, limit=settings.page_limit + 1) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') return render('/comments.html', section='comments', unread=unread, posts=plist, page=page)
def recent_all(page=1, unread=False): if not env.owner or env.owner.id != env.user.id: return Response(redirect="%s://%s.%s/recent" % \ (env.request.protocol, env.user.login, settings.domain)) try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit unread = bool(unread) plist = posts.recent_posts(unread=unread, offset=offset, limit=settings.page_limit+1) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') return render('/recent.html', section='recent_all', unread=unread, posts=plist, page=page)
def posts(self, limit=None): posts = [] lp = self.last_published() for p in self._posts: try: if self.id and lp and p.created <= lp: continue except TypeError: log.error('-- created "%s" <> lp "%s"' % (p.created, lp)) raise FeedFetchError posts.append(p) posts.sort(lambda a, b: int(timestamp(a.created) - timestamp(b.created))) if limit is not None: return posts[-abs(int(limit)):] return posts
def update_task(self): if not self.id: return res = db.fetchall( "SELECT created FROM posts.posts WHERE author=%s " "ORDER BY created DESC LIMIT 10;", [self.id]) now = datetime.now() timestamps = [] for p in res: timestamps.append(timestamp(p['created'])) if len(timestamps) < 2: self.update_at(now + timedelta(seconds=settings.feed_max_update_timeout)) return lp = self.last_published() tz = timezone(settings.timezone) newlp = tz.localize(datetime.fromtimestamp(int(max(timestamps)))) if newlp > lp: self.last_published(newlp) timestamps.append(timestamp(now)) timestamps.sort() deltas = [] for i in xrange(1, len(timestamps)): deltas.append(timestamps[i] - timestamps[i - 1]) delta = reduce(lambda mem, t: mem + t, deltas, 0) / len(deltas) + 60 if delta < settings.feed_min_update_timeout: delta = settings.feed_min_update_timeout if delta > settings.feed_max_update_timeout: delta = settings.feed_max_update_timeout update_at = now + timedelta(seconds=delta) self.update_at(update_at) del timestamps
def posts(self, limit=None): posts = [] lp = self.last_published() for p in self._posts: try: if self.id and lp and p.created <= lp: continue except TypeError: log.error('-- created "%s" <> lp "%s"' % (p.created, lp)) raise FeedFetchError posts.append(p) posts.sort( lambda a, b: int(timestamp(a.created) - timestamp(b.created))) if limit is not None: return posts[-abs(int(limit)):] return posts
def update_task(self): if not self.id: return res = db.fetchall("SELECT created FROM posts.posts WHERE author=%s " "ORDER BY created DESC LIMIT 10;", [self.id]) now = datetime.now() timestamps = [] for p in res: timestamps.append(timestamp(p['created'])) if len(timestamps) < 2: self.update_at(now + timedelta(seconds=settings.feed_max_update_timeout)) return lp = self.last_published() tz = timezone(settings.timezone) newlp = tz.localize(datetime.fromtimestamp(int(max(timestamps)))) if newlp > lp: self.last_published(newlp) timestamps.append(timestamp(now)) timestamps.sort() deltas = [] for i in xrange(1, len(timestamps)): deltas.append(timestamps[i] - timestamps[i-1]) delta = reduce(lambda mem, t: mem+t, deltas, 0) / len(deltas) + 60 if delta < settings.feed_min_update_timeout: delta = settings.feed_min_update_timeout if delta > settings.feed_max_update_timeout: delta = settings.feed_max_update_timeout update_at = now + timedelta(seconds=delta) self.update_at(update_at) del timestamps
def tag_posts(tag, page=1): if env.request.host != settings.domain and (not env.owner or not env.owner.id): raise UserNotFound try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit if env.owner and env.owner.id: author = env.owner else: author = None if env.owner and env.owner.id == env.user.id: private = None else: private = False # variable deny_anonymous is for corresponding value of 'deny_anonymous' # field in 'users.profile' table deny_anonymous = False if not env.user.is_authorized() else None if not isinstance(tag, (list, tuple)): tag = [tag] tag = [t.decode('utf-8', 'ignore').replace(u"\xa0", " ") for t in tag] plist = posts.select_posts(author=author, private=private, deny_anonymous=deny_anonymous, tags=tag, offset=offset, limit=settings.page_limit + 1) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') section = 'blog' if env.owner and env.user.id == env.owner.id else '' return render('/tags.html', section=section, posts=plist, page=page, tags=tag)
def messages_outgoing(page=1): try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit plist = posts.private_outgoing(offset=offset, limit=settings.page_limit+1) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') return render('/messages/outgoing.html', section='messages/outgoing', posts=plist, page=page)
def tag_posts(tag, page=1): if env.request.host != settings.domain and (not env.owner or not env.owner.id): raise UserNotFound try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit if env.owner and env.owner.id: author = env.owner else: author = None if env.owner and env.owner.id == env.user.id: private = None else: private = False # variable deny_anonymous is for corresponding value of 'deny_anonymous' # field in 'users.profile' table deny_anonymous = False if not env.user.is_authorized() else None if not isinstance(tag, (list, tuple)): tag = [tag] tag = [t.decode('utf-8', 'ignore').replace(u"\xa0", " ") for t in tag] plist = posts.select_posts(author=author, private=private, deny_anonymous=deny_anonymous, tags=tag, offset=offset, limit=settings.page_limit+1) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') section = 'blog' if env.owner and env.user.id == env.owner.id else '' return render('/tags.html', section=section, posts=plist, page=page, tags=tag)
def blog(page=1): try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 if not env.owner or not env.owner.id: raise UserNotFound offset = (page - 1) * settings.page_limit plist = posts.recent_blog_posts(env.owner, settings.page_limit+1, offset) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) p['text'] = markdown_filter(None, p['text']) return Response(json.dumps(plist), mimetype='application/json') return render('/blog.html', section='blog', posts=plist, page=page)
def messages_new(page=1): try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 offset = (page - 1) * settings.page_limit plist = posts.private_unread(offset=offset, limit=settings.page_limit+1) if not plist and page == 1: return Response(redirect='%s://%s/messages/incoming' % \ (env.request.protocol, settings.domain)) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) return Response(json.dumps(plist), mimetype='application/json') return render('/messages/index.html', section='messages', posts=plist, page=page)
def blog(page=1): try: page = int(page) except (TypeError, ValueError): page = 1 if not page: page = 1 if not env.owner or not env.owner.id: raise UserNotFound offset = (page - 1) * settings.page_limit plist = posts.recent_blog_posts(env.owner, settings.page_limit + 1, offset) if env.request.is_xhr: for p in plist: p['created'] = timestamp(p['created']) p['text'] = markdown_filter(None, p['text']) return Response(json.dumps(plist), mimetype='application/json') return render('/blog.html', section='blog', posts=plist, page=page)
def register(): #raise Forbidden if env.user.id: raise AlreadyAuthorized sess = Session() info = sess['reg_info'] or {} if env.request.method == 'GET': try: del info['network'] del info['uid'] except (KeyError, TypeError): pass sess['reg_info'] = info sess['reg_start'] = timestamp(datetime.now()) sess.save() try: info['birthdate'] = parse_date(info['birthdate']) \ or datetime.now() - timedelta(days=365*16+4) except (KeyError, TypeError): info['birthdate'] = None return render('/auth/register.html', fields=ULOGIN_FIELDS, info=info) if cache_get('reg-ok:%s' % env.request.remote_host): raise Forbidden hi1 = env.request.args('hi1') try: hi2 = int(env.request.args('hi2', 0)) except ValueError: hi2 = 0 #try: # h = hi2 / (timestamp(datetime.now()) - int(sess['reg_start'])) #except: # raise Forbidden #finally: # pass if hi2 < 5: raise Forbidden try: network = info['network'] if 'network' in info else None uid = info['uid'] if 'uid' in info else None except TypeError: network = None uid = None errors = [] for p in [ 'login', 'name', 'email', 'birthdate', 'location', 'about', 'homepage' ]: info[p] = env.request.args(p, '').decode('utf-8') info['gender'] = _gender(env.request.args('gender')) login = env.request.args('login', '').strip() if hi1 != login: raise Forbidden if login and validate_nickname(login): try: u = User('login', login) if u.id: errors.append('login-in-use') except UserNotFound: pass elif login: errors.append('login-invalid') else: errors.append('login-empty') password = env.request.args('password') confirm = env.request.args('confirm') if not (network and uid): if not password: errors.append('password') elif password != confirm: errors.append('confirm') info['birthdate'] = parse_date(info['birthdate']) \ or datetime.now() - timedelta(days=365*16+4) if not network and not errors: try: text = env.request.args('recaptcha_response_field') challenge = env.request.args('recaptcha_challenge_field') resp = captcha.submit(challenge, text, settings.recaptcha_private_key, env.request.remote_host) if not resp.is_valid: errors.append('captcha') except urllib2.URLError, e: log.error('recaptcha fail: %s' % e) #errors.append('recaptcha-fail') except AddressNotFound: return Response(redirect='%s://%s/remember?fail=1' % \ (env.request.protocol, settings.domain))
return Response(redirect='%s://%s/remember?fail=1' % \ (env.request.protocol, settings.domain)) if not errors: try: users.register(login) except UserExists: errors.append('login-in-use') if errors: if network and uid: tmpl = '/auth/register_ulogin.html' else: tmpl = '/auth/register.html' sess['reg_start'] = timestamp(datetime.now()) sess.save() return render(tmpl, fields=ULOGIN_FIELDS, info=info, errors=errors) for p in [ 'name', 'email', 'birthdate', 'gender', 'location', 'about', 'homepage' ]: env.user.set_info(p, info[p]) if password: env.user.set_password(password) if network and uid: _nickname = info['_nickname'] if '_nickname' in info else None _name = info['_name'] if '_name' in info else None
def register(): #raise Forbidden if env.user.id: raise AlreadyAuthorized sess = Session() info = sess['reg_info'] or {} if env.request.method == 'GET': try: del info['network'] del info['uid'] except (KeyError, TypeError): pass sess['reg_info'] = info sess['reg_start'] = timestamp(datetime.now()) sess.save() try: info['birthdate'] = parse_date(info['birthdate']) \ or datetime.now() - timedelta(days=365*16+4) except (KeyError, TypeError): info['birthdate'] = None return render('/auth/register.html', fields=ULOGIN_FIELDS, info=info) if cache_get('reg-ok:%s' % env.request.remote_host): raise Forbidden hi1 = env.request.args('hi1') try: hi2 = int(env.request.args('hi2', 0)) except ValueError: hi2 = 0 #try: # h = hi2 / (timestamp(datetime.now()) - int(sess['reg_start'])) #except: # raise Forbidden #finally: # pass if hi2 < 5: raise Forbidden try: network = info['network'] if 'network' in info else None uid = info['uid'] if 'uid' in info else None except TypeError: network = None uid = None errors = [] for p in ['login', 'name', 'email', 'birthdate', 'location', 'about', 'homepage']: info[p] = env.request.args(p, '').decode('utf-8') info['gender'] = _gender(env.request.args('gender')) login = env.request.args('login', '').strip() if hi1 != login: raise Forbidden if login and validate_nickname(login): try: u = User('login', login) if u.id: errors.append('login-in-use') except UserNotFound: pass elif login: errors.append('login-invalid') else: errors.append('login-empty') password = env.request.args('password') confirm = env.request.args('confirm') if not (network and uid): if not password: errors.append('password') elif password != confirm: errors.append('confirm') info['birthdate'] = parse_date(info['birthdate']) \ or datetime.now() - timedelta(days=365*16+4) if not network and not errors: try: text = env.request.args('recaptcha_response_field') challenge = env.request.args('recaptcha_challenge_field') resp = captcha.submit(challenge, text, settings.recaptcha_private_key, env.request.remote_host) if not resp.is_valid: errors.append('captcha') except urllib2.URLError, e: log.error('recaptcha fail: %s' % e) #errors.append('recaptcha-fail') except AddressNotFound: return Response(redirect='%s://%s/remember?fail=1' % \ (env.request.protocol, settings.domain))
return Response(redirect='%s://%s/remember?fail=1' % \ (env.request.protocol, settings.domain)) if not errors: try: users.register(login) except UserExists: errors.append('login-in-use') if errors: if network and uid: tmpl = '/auth/register_ulogin.html' else: tmpl = '/auth/register.html' sess['reg_start'] = timestamp(datetime.now()) sess.save() return render(tmpl, fields=ULOGIN_FIELDS, info=info, errors=errors) for p in ['name', 'email', 'birthdate', 'gender', 'location', 'about', 'homepage']: env.user.set_info(p, info[p]) if password: env.user.set_password(password) if network and uid: _nickname = info['_nickname'] if '_nickname' in info else None _name = info['_name'] if '_name' in info else None _profile = info['_profile'] if '_profile' in info else None try: env.user.bind_ulogin(network, uid, _nickname, _name, _profile)