def index(self, request): tags = [] if request.args.get('tags'): tags = ifilter(bool, (Tag.query.public().filter_by(name=t).one() \ for t in request.args.get('tags').split())) form = AddEventForm(request.form) if form.validate_on_submit(): #: Create the event object e = Event(title=form.title.data, text=form.text.data, author=request.user, start_date=form.start.data, end_date=form.end.data, tags=form.tags.data, discussion_question_id=None, info_question_id=None) db.session.commit() #: Check for creating a question-object for an event discussion if form.discussion_question.data: q_discussion = Question( title=u'[Event discussion] %s' % form.title.data, author=request.user, text=u'This is the discussion for the event [%s "%s"]' % (href(e, _external=True), form.title.data), tags=form.tags.data) else: q_discussion = None #: Check for creating a question-object an event information if form.info_question.data: q_info = Question( title=u'[Event information] %s' % form.title.data, author=request.user, text= u'This is the information topic for the event [%s "%s"]' % (href(e, _external=True), form.title.data), tags=form.tags.data) else: q_info = None db.session.commit() if q_discussion: e.discussion_question_id = q_discussion.id if q_info: e.info_question_id = q_info.id db.session.commit() return redirect_to(e) return { 'form': form, }
def index(self, request): tags = [] if request.args.get('tags'): tags = ifilter(bool, (Tag.query.public().filter_by(name=t).one() \ for t in request.args.get('tags').split())) form = AddEventForm(request.form) if form.validate_on_submit(): #: Create the event object e = Event(title=form.title.data, text=form.text.data, author=request.user, start_date=form.start.data, end_date=form.end.data, tags=form.tags.data, discussion_question_id = None, info_question_id = None) db.session.commit() #: Check for creating a question-object for an event discussion if form.discussion_question.data: q_discussion = Question(title=u'[Event discussion] %s' % form.title.data, author=request.user, text=u'This is the discussion for the event [%s "%s"]' % (href(e, _external=True), form.title.data), tags=form.tags.data) else: q_discussion = None #: Check for creating a question-object an event information if form.info_question.data: q_info = Question(title=u'[Event information] %s' % form.title.data, author=request.user, text=u'This is the information topic for the event [%s "%s"]' % (href(e, _external=True), form.title.data), tags=form.tags.data) else: q_info = None db.session.commit() if q_discussion: e.discussion_question_id = q_discussion.id if q_info: e.info_question_id = q_info.id db.session.commit() return redirect_to(e) return { 'form': form, }
def question(self, request, slug, sort='votes', page=1): question = Question.query.filter_by(slug=slug).one() answer_query = Answer.query.filter_by(question=question) # Order by "votes", "latest" or "oldest" answer_query = getattr(answer_query, sort) pagination = URLPagination(answer_query, page) form = AnswerQuestionForm(request.form) if form.validate_on_submit(): answer = Answer(author=request.user, question=question, text=form.text.data) db.session.commit() return redirect(href(question)) # increase counters question.touch() # precalculate user votes answers = pagination.query user_votes = Vote.query.get_user_votes_on(request.user.id, [a.id for a in answers]) return { 'sort': sort, 'question': question, 'answers': pagination.query, 'form': form, 'pagination': pagination, 'user_votes': user_votes }
def _prepare(self, answer): return { 'id': answer.id, 'text': answer.text, 'date': answer.date_created.date(), 'title': answer.question.title, 'author': answer.author.username, 'link': href(answer), }
def _prepare(self, article): return { 'id': article.id, 'title': article.title, 'text': article.intro + article.text, 'date': article.pub_date.date(), 'author': article.author.username, 'link': href(article), 'tag': article.tags, }
def _prepare(self, question): return { 'id': question.id, 'text': question.text, 'date': question.date_created.date(), 'author': question.author.username, 'title': question.title, 'link': href(question), 'tag': question.tags, }
def article_feed(self, request, slug=None): """ Shows all news entries that match the given criteria in an atom feed. """ query = Article.query title = u"News" if slug: # filter the articles matching a defined tag tag = Tag.query.public().filter_by(slug=slug).one() query = tag.articles title = _(u"News for %s" % slug) query = query.options(db.eagerload("author")).order_by(Article.updated.desc()).limit(20) feed = AtomFeed( _(u"%s – %s" % (title, ctx.cfg["website_title"])), feed_url=request.url, url=request.url_root, icon=href("static", file="img/favicon.ico"), ) for article in query.all(): value = u"%s\n%s" % ( article.get_rendered_text(article.intro, request, "html"), article.get_rendered_text(article.text, request, "html"), ) feed.add( article.title, value, content_type="html", url=href(article, _external=True), author={"name": article.author.display_name, "uri": href(article.author.profile)}, id=article.guid, updated=article.updated, published=article.pub_date, ) return feed
def confirm_action(request, message, endpoint, **kwargs): """Flash a csrf protected "Are you sure?" form.""" from inyoka.core.api import render_template, href from inyoka.core.forms import Form form = Form(request.form) if form.validate_on_submit(): return 'confirm' in request.form request.flash(render_template('utils/confirm.html', { 'message': message, 'form': form, 'destination': href(endpoint, **kwargs) }), html=True) return False
def article_feed(self, request, slug=None): """ Shows all news entries that match the given criteria in an atom feed. """ query = Article.query title = u'News' if slug: # filter the articles matching a defined tag tag = Tag.query.public().filter_by(slug=slug).one() query = tag.articles title = _(u'News for %s' % slug) query = query.options(db.eagerload('author')) \ .order_by(Article.updated.desc()).limit(20) feed = AtomFeed(_(u'%s – %s' % (title, ctx.cfg['website_title'])), feed_url=request.url, url=request.url_root, icon=href('static', file='img/favicon.ico')) for article in query.all(): value = u'%s\n%s' % ( article.get_rendered_text(article.intro, request, 'html'), article.get_rendered_text(article.text, request, 'html')) feed.add(article.title, value, content_type='html', url=href(article, _external=True), author={ 'name': article.author.display_name, 'uri': href(article.author.profile) }, id=article.guid, updated=article.updated, published=article.pub_date) return feed
def create_stub_tags(): global _link_file from inyoka.core.models import Tag num = {'small': 10, 'medium': 25, 'large': 50}[SIZE] used = set() for x in xrange(randrange(num - 5, num + 5)): while 1: tag = choice(TAGLIST) if tag not in used: used.add(tag) obj = Tag(name=tag) break db.session.commit() links = [href(tag, _external=True) for tag in Tag.query.all()] _link_file.write(u'\n'.join(links))
def deactivate(self, request): form = DeactivateProfileForm(request.form) if form.validate_on_submit(): if not request.user.check_password(form.password.data): form.password.errors = [_(u'The password was not correct.')] else: user = request.user get_auth_system().logout(request) user.deactivate() db.session.commit() request.flash(_(u'Your profile was deactivated successfully'), success=True) return redirect(href('portal/index')) return { 'form': form }
def password(self, request): form = get_change_password_form(request)(request.form) if form.validate_on_submit(): if not request.user.check_password(form.old_password.data): form.old_password.errors = [_(u'The password you entered ' u'doesn\'t match your old one.')] else: request.user.set_password(form.new_password.data) db.session.commit() request.flash(_(u'Your password was changed successfully'), success=True) return redirect(href('usercp/index')) return { 'random_pw': form.new_password.data, 'form': form, }
def test_href(): # set base domain name for correct testing domain = ctx.cfg['base_domain_name'] eq_(href('portal/index'), '/') eq_(href('portal/index', _external=True), 'http://%s/' % domain) eq_(href('portal/index', _anchor='News'), '/#News') eq_(href('portal/index', _external=True, _anchor='News'), 'http://%s/#News' % domain) class HrefTester(): def get_url_values(self, kw): if kw == 'foo': return 'portal/index', {'kw':'foo', '_anchor':'heydiho'} elif kw == 'bar': return 'portal/index', {'foo':'bar'} ht = HrefTester() eq_(href(ht, kw='foo'), '/?kw=foo#heydiho') eq_(href(ht, kw='foo', _anchor='bar'), '/?kw=foo#heydiho') eq_(href(ht, kw='bar'), '/?foo=bar')
def test_href(): # set base domain name for correct testing domain = ctx.cfg['base_domain_name'] eq_(href('portal/index'), '/') eq_(href('portal/index', _external=True), 'http://%s/' % domain) eq_(href('portal/index', _anchor='News'), '/#News') eq_(href('portal/index', _external=True, _anchor='News'), 'http://%s/#News' % domain) class HrefTester(): def get_url_values(self, kw): if kw == 'foo': return 'portal/index', {'kw': 'foo', '_anchor': 'heydiho'} elif kw == 'bar': return 'portal/index', {'foo': 'bar'} ht = HrefTester() eq_(href(ht, kw='foo'), '/?kw=foo#heydiho') eq_(href(ht, kw='foo', _anchor='bar'), '/?kw=foo#heydiho') eq_(href(ht, kw='bar'), '/?foo=bar')
def create_news_test_data(): global _link_file from inyoka.core.auth.models import User from inyoka.news.models import Tag, Comment, Article users = User.query.all() tags = Tag.query.public().all() num = {'small': 10, 'medium': 50, 'large': 100}[SIZE] used = set() for x in xrange(randrange(num - 5, num + 5)): while 1: title = generate_lorem_ipsum(1, False, 3, 9) if title not in used: shuffle(tags) these_tags = tags[:randrange(2, 6)] user = choice(users) article = Article(title=title, intro=chomsky(randint(0, 5) or 10), text=chomsky(randint(0, 100) or 200), public=choice([True, False]), tags=these_tags, author=user) used.add(title) break db.session.commit() _link_file.write(u'\n'.join( [href(a, _external=True) for a in Article.query.all()])) # comments replies = {'small': 4, 'medium': 8, 'large': 12}[SIZE] articles = Article.query.all() for article in articles: for x in xrange(randrange(replies * 4)): article = choice(articles) user = choice(users) comment = Comment(text=chomsky(randint(0, 5) or 10), author=user, article=article) db.session.commit()
def create_news_test_data(): global _link_file from inyoka.core.auth.models import User from inyoka.news.models import Tag, Comment, Article users = User.query.all() tags = Tag.query.public().all() num = {'small': 10, 'medium': 50, 'large': 100}[SIZE] used = set() for x in xrange(randrange(num - 5, num + 5)): while 1: title = generate_lorem_ipsum(1, False, 3, 9) if title not in used: shuffle(tags) these_tags = tags[:randrange(2,6)] user = choice(users) article = Article(title=title, intro=chomsky(randint(0, 5) or 10), text=chomsky(randint(0, 100) or 200), public=choice([True, False]), tags=these_tags, author=user) used.add(title) break db.session.commit() _link_file.write(u'\n'.join([href(a, _external=True) for a in Article.query.all()])) # comments replies = {'small': 4, 'medium': 8, 'large': 12}[SIZE] articles = Article.query.all() for article in articles: for x in xrange(randrange(replies * 4)): article = choice(articles) user = choice(users) comment = Comment(text=chomsky(randint(0, 5) or 10), author=user, article=article) db.session.commit()
def create_forum_test_data(): global _link_file from inyoka.forum.models import Tag, Forum, Question, Answer, Vote, ForumEntry from inyoka.core.auth.models import User links = [] u1 = User.query.filter_by(username=u'dummuser').first() u2 = User.query.filter_by(username=u'quaki').first() # tags gnome = Tag(name=u'GNOME') gtk = Tag(name=u'GTK') kde = Tag(name=u'KDE') qt = Tag(name=u'QT') window_manager = Tag(name=u'Window-Manager') hardware = Tag(name=u'Hardware') inyoka = Tag(name=u'Inyoka') audio = Tag(name=u'Audio') db.session.commit() main_tags = [gnome, gtk, kde, qt, window_manager, hardware, inyoka, audio] # forums inyoka_forum = Forum( name=u'Inyoka Project', description=u'Please tell us your opinion about the new Inyoka!', tags=[inyoka]) gnome_forum = Forum( name=u'The GNOME Desktop (Ubuntu)', description=u'Here you can find all GNOME and GTK related questions.', tags=[gnome, gtk]) kde_forum = Forum( name=u'KDE Plasma (Kubuntu)', description=u'Everything about KDE, the desktop environment of Kubuntu.', tags=[kde, qt]) window_manager_forum = Forum( name=u'Desktop Environments and Window Managers', description=u'Aks everything about GNOME, KDE or any other exotic window manager here', subforums=[gnome_forum, kde_forum], tags=[window_manager]) hardware_forum = Forum( name=u'Hardware Problems', description=u'Describe your hardware problems here', tags=[hardware]) db.session.commit() tags = Tag.query.public().all() users = tuple(User.query.options(db.eagerload('groups')).all()) last_date = None questions = [] num, var = {'small': (50, 10), 'medium': (250, 50), 'large': (1000, 200)}[SIZE] for x in xrange(randrange(num - var, num + var)): if random() >= 0.8: # we use them a bit more than others, to get a more realistic # tag usage. these_tags = main_tags else: these_tags = list(tags) shuffle(these_tags) question = Question(title=generate_lorem_ipsum(1, False, 3, 9), text=chomsky(randint(0, 10) or 40), author=choice(users), date_created=get_date(last_date), tags=these_tags[:randrange(1, 6)]) last_date = question.date_created questions.append(question) db.session.commit() links.extend([href(q, _external=True) for q in questions]) # answers replies = {'small': 4, 'medium': 8, 'large': 12}[SIZE] answers = [] last_date = questions[-1].date_created shuffle(questions) for question in questions[:randrange(len(questions))]: for x in xrange(randrange(2, replies)): answer = Answer(question=question, author=choice(users), text=chomsky(randint(0, 10) or 40), date_created=get_date(last_date)) answers.append(answer) last_date = answer.date_created db.session.commit() voted_map = [] objects = answers + questions for obj in objects[:randrange(len(objects))]: for x in xrange(randrange(2, replies * 4)): entry = choice(objects) user = choice(users) if (user.id, entry.entry_id) not in voted_map: if random() >= 0.2: v = Vote(score=+1, user=user) elif random() >= 0.5: v = Vote(score=-1, user=user) else: break v.entry_id = entry.entry_id v.favorite = random() > 0.9 entry.votes.append(v) voted_map.append((user.id, entry.entry_id)) db.session.commit() _link_file.write(u'\n'.join(links))
def create_test_users(): global _link_file from inyoka.core.auth.models import User, UserProfile, Group # admin user admin = User(username=u'admin', email=u'root@localhost', password=u'default') admin.status = u'normal' admin_profile = UserProfile(user=admin) # some crazy users user_instances = [] users = { u'apollonier': (u'*****@*****.**', u'rocket!', {'real_name': u'Apollo der Große', 'location': u'Österreich'}), u'tux der große': (u'*****@*****.**', u'pinguin', {'real_name': u'Tuxorius', 'location': u'Österreich'}), u'quaki': (u'*****@*****.**', u'fluss', {'real_name': u'Quaki der ganz ganz Große', 'location': u'Germany'}), u'maxarian': (u'*****@*****.**', u'damn!', {'real_name': u'Marian Florianus', 'location': u'Berlin/Germany'}), u'dummuser': (u'*****@*****.**', u'dumm?', {'real_name': u'Dummorius', 'location': u'/dev/zero'}), u'FedoraFlo': (u'*****@*****.**', u'default', {'real_name': u'Florius Maximus', 'location': u'Frankfurt/Germany'}), u'lidnele': (u'*****@*****.**', u'default', {'real_name': u'Andreas Lilende', 'location': u'ubuntuusers.de'}), u'Kami': (u'*****@*****.**', u'default', {'real_name': u'Aldaran Utama Putiran', 'location': u'Turkey'}), u'carost': (u'*****@*****.**', u'default', {'real_name': u'Tschaka Bam', 'location': u'Germany'}), u'The-Decompiler': (u'*****@*****.**', u'default', {'real_name': u'©æſð殀“”@', 'location': u'/dev/cdrom'}), u'guj': (u'[email protected]', u'default', {'real_name': u'Yea Man', 'location': u'Germany'}), u'RoterRitter': (u'*****@*****.**', u'default', {'real_name': u'Der Rote Ritter mit der langen Lanze', 'location': u'Burg Rotenstein'}), u'Kebap': (u'dö@n.er', u'default', {'real_name': u'DönerDönerDönerDöner', 'location': u'Berlin'}), } for user in users: email, pw = users[user][:-1] u = User(username=user, email=email, password=pw) u.status = u'normal' p = UserProfile(user=u, **users[user][-1]) user_instances.append(u) db.session.commit() team = Group(name=u'Team') webteam = Group(name=u'Webteam', parents=set([team]), users=user_instances[:4]) supporter = Group(name=u'Supporter', parents=set([team]), users=user_instances[4:-2]) multimedia = Group(name=u'Supporter Multimedia', parents=set([supporter]), users=user_instances[-2:]) ikhayateam = Group(name=u'Ikhayateam', parents=set([team])) db.session.commit() # create some stub and dummy users... num = {'small': 15, 'medium': 30, 'large': 50}[SIZE] used = set() groups = [team, webteam, supporter, multimedia, ikhayateam] for x in xrange(num): while 1: username = choice(USERNAMES) if username not in used: used.add(username) break u = User(username=username, email=u'*****@*****.**' % username, password=u'default') UserProfile(user=u) if random() > 0.6: u.groups = [choice(groups)] db.session.commit() # store links for benchmark tests links = [href(u.profile, _external=True) for u in User.query.all()] links.extend([href(g, _external=True) for g in groups]) _link_file.write(u'\n'.join(links))
def create_test_users(): global _link_file from inyoka.core.auth.models import User, UserProfile, Group # admin user admin = User(username=u'admin', email=u'root@localhost', password=u'default') admin.status = u'normal' admin_profile = UserProfile(user=admin) # some crazy users user_instances = [] users = { u'apollonier': (u'*****@*****.**', u'rocket!', { 'real_name': u'Apollo der Große', 'location': u'Österreich' }), u'tux der große': (u'*****@*****.**', u'pinguin', { 'real_name': u'Tuxorius', 'location': u'Österreich' }), u'quaki': (u'*****@*****.**', u'fluss', { 'real_name': u'Quaki der ganz ganz Große', 'location': u'Germany' }), u'maxarian': (u'*****@*****.**', u'damn!', { 'real_name': u'Marian Florianus', 'location': u'Berlin/Germany' }), u'dummuser': (u'*****@*****.**', u'dumm?', { 'real_name': u'Dummorius', 'location': u'/dev/zero' }), u'FedoraFlo': (u'*****@*****.**', u'default', { 'real_name': u'Florius Maximus', 'location': u'Frankfurt/Germany' }), u'lidnele': (u'*****@*****.**', u'default', { 'real_name': u'Andreas Lilende', 'location': u'ubuntuusers.de' }), u'Kami': (u'*****@*****.**', u'default', { 'real_name': u'Aldaran Utama Putiran', 'location': u'Turkey' }), u'carost': (u'*****@*****.**', u'default', { 'real_name': u'Tschaka Bam', 'location': u'Germany' }), u'The-Decompiler': (u'*****@*****.**', u'default', { 'real_name': u'©æſð殀“”@', 'location': u'/dev/cdrom' }), u'guj': (u'[email protected]', u'default', { 'real_name': u'Yea Man', 'location': u'Germany' }), u'RoterRitter': (u'*****@*****.**', u'default', { 'real_name': u'Der Rote Ritter mit der langen Lanze', 'location': u'Burg Rotenstein' }), u'Kebap': (u'dö@n.er', u'default', { 'real_name': u'DönerDönerDönerDöner', 'location': u'Berlin' }), } for user in users: email, pw = users[user][:-1] u = User(username=user, email=email, password=pw) u.status = u'normal' p = UserProfile(user=u, **users[user][-1]) user_instances.append(u) db.session.commit() team = Group(name=u'Team') webteam = Group(name=u'Webteam', parents=set([team]), users=user_instances[:4]) supporter = Group(name=u'Supporter', parents=set([team]), users=user_instances[4:-2]) multimedia = Group(name=u'Supporter Multimedia', parents=set([supporter]), users=user_instances[-2:]) ikhayateam = Group(name=u'Ikhayateam', parents=set([team])) db.session.commit() # create some stub and dummy users... num = {'small': 15, 'medium': 30, 'large': 50}[SIZE] used = set() groups = [team, webteam, supporter, multimedia, ikhayateam] for x in xrange(num): while 1: username = choice(USERNAMES) if username not in used: used.add(username) break u = User(username=username, email=u'*****@*****.**' % username, password=u'default') UserProfile(user=u) if random() > 0.6: u.groups = [choice(groups)] db.session.commit() # store links for benchmark tests links = [href(u.profile, _external=True) for u in User.query.all()] links.extend([href(g, _external=True) for g in groups]) _link_file.write(u'\n'.join(links))
def create_forum_test_data(): global _link_file from inyoka.forum.models import Tag, Forum, Question, Answer, Vote, ForumEntry from inyoka.core.auth.models import User links = [] u1 = User.query.filter_by(username=u'dummuser').first() u2 = User.query.filter_by(username=u'quaki').first() # tags gnome = Tag(name=u'GNOME') gtk = Tag(name=u'GTK') kde = Tag(name=u'KDE') qt = Tag(name=u'QT') window_manager = Tag(name=u'Window-Manager') hardware = Tag(name=u'Hardware') inyoka = Tag(name=u'Inyoka') audio = Tag(name=u'Audio') db.session.commit() main_tags = [gnome, gtk, kde, qt, window_manager, hardware, inyoka, audio] # forums inyoka_forum = Forum( name=u'Inyoka Project', description=u'Please tell us your opinion about the new Inyoka!', tags=[inyoka]) gnome_forum = Forum( name=u'The GNOME Desktop (Ubuntu)', description=u'Here you can find all GNOME and GTK related questions.', tags=[gnome, gtk]) kde_forum = Forum( name=u'KDE Plasma (Kubuntu)', description= u'Everything about KDE, the desktop environment of Kubuntu.', tags=[kde, qt]) window_manager_forum = Forum( name=u'Desktop Environments and Window Managers', description= u'Aks everything about GNOME, KDE or any other exotic window manager here', subforums=[gnome_forum, kde_forum], tags=[window_manager]) hardware_forum = Forum(name=u'Hardware Problems', description=u'Describe your hardware problems here', tags=[hardware]) db.session.commit() tags = Tag.query.public().all() users = tuple(User.query.options(db.eagerload('groups')).all()) last_date = None questions = [] num, var = { 'small': (50, 10), 'medium': (250, 50), 'large': (1000, 200) }[SIZE] for x in xrange(randrange(num - var, num + var)): if random() >= 0.8: # we use them a bit more than others, to get a more realistic # tag usage. these_tags = main_tags else: these_tags = list(tags) shuffle(these_tags) question = Question(title=generate_lorem_ipsum(1, False, 3, 9), text=chomsky(randint(0, 10) or 40), author=choice(users), date_created=get_date(last_date), tags=these_tags[:randrange(1, 6)]) last_date = question.date_created questions.append(question) db.session.commit() links.extend([href(q, _external=True) for q in questions]) # answers replies = {'small': 4, 'medium': 8, 'large': 12}[SIZE] answers = [] last_date = questions[-1].date_created shuffle(questions) for question in questions[:randrange(len(questions))]: for x in xrange(randrange(2, replies)): answer = Answer(question=question, author=choice(users), text=chomsky(randint(0, 10) or 40), date_created=get_date(last_date)) answers.append(answer) last_date = answer.date_created db.session.commit() voted_map = [] objects = answers + questions for obj in objects[:randrange(len(objects))]: for x in xrange(randrange(2, replies * 4)): entry = choice(objects) user = choice(users) if (user.id, entry.entry_id) not in voted_map: if random() >= 0.2: v = Vote(score=+1, user=user) elif random() >= 0.5: v = Vote(score=-1, user=user) else: break v.entry_id = entry.entry_id v.favorite = random() > 0.9 entry.votes.append(v) voted_map.append((user.id, entry.entry_id)) db.session.commit() _link_file.write(u'\n'.join(links))