class CoreServiceController(IServiceProvider): component = 'core' url_rules = [ Rule('/get_tags/', endpoint='get_tags'), Rule('/get_translations/', endpoint='get_translations'), Rule('/get_user/', endpoint='get_user'), ] #@service('get_tags', config={'core.tag': ['label', 'value'], 'show_type': False}) @service('get_tags') def get_tags(self, request): q = request.args.get('q') if not q: tags = Tag.query.all() else: tags = Tag.query.filter(Tag.name.startswith(q)) return [{'label': tag.name, 'value': tag.id} for tag in tags[:10]] @service('get_user') def get_user(self, request): q = request.args.get('term') if not q: users = User.query.all() else: users = User.query.filter(User.username.startswith(q)) return [user.username for user in users[:10]] @service('get_translations') def get_translations(self, request): return serve_javascript(request)
class NewsAdminProvider(IController): """The integration hook for the admin interface""" name = u'news' url_rules = [ Rule('/new_article/', endpoint='article_edit', defaults={'slug': None}), Rule('/<slug>/edit/', endpoint='article_edit'), Rule('/<slug>/delete', endpoint='article_delete') ] @login_required @view('article_edit') @templated('news/admin/article_edit.html') def articles_edit(self, request, slug=None): new = slug is None if new: article, data = Article(), {'tags': []} else: article = Article.query.filter_by(slug=slug).one() data = model_to_dict(article, exclude=('slug')) form = EditArticleForm(request.form, **data) if 'delete' in request.form: return redirect_to('news/article_delete', slug=article.slug) elif form.validate_on_submit(): article = update_model(article, form, ('pub_date', 'updated', 'title', 'intro', 'text', 'public', 'tags', 'author')) db.session.commit() msg = slug and _(u'Updated article “%s”') \ or _(u'Created article “%s”') request.flash(msg % article.title, True) return redirect_to(article) return { 'form': form, 'article': article, } @login_required @view('article_delete') def articles_delete(self, request, slug): article = Article.query.filter_by(slug=slug).one() if 'cancel' in request.form: request.flash(_(u'Action canceled')) elif request.method in ('POST', 'PUT') and 'confirm' in request.form: db.session.delete(article) db.session.commit() request.flash(_(u'The article “%s” was deleted successfully.' % article.title)) return redirect_to('news/articles') else: request.flash(render_template('news/admin/article_delete.html', { 'article': article }), html=True) return redirect_to(article, action='edit')
class PasteServices(IServiceProvider): name = 'paste' url_rules = [ Rule('/', endpoint='get_pastes'), Rule('/<int:limit>', endpoint='get_pastes'), Rule('/paste/<int:id>', endpoint='get_pastes') ] @service('get_pastes') def get_pastes(self, request, id=None, limit=10): if id is not None: return PasteEntry.query.get(id) return PasteEntry.query.limit(limit).all()
class EventServices(IServiceProvider): name = 'event' url_rules = [ Rule('/', endpoint='get_events'), Rule('/<int:limit>', endpoint='get_events'), Rule('/event/<int:id>', endpoint='get_events') ] @service('get_events') def get_events(self, request, id=None, limit=10): if id is not None: return Event.query.get(id) return Event.query.limit(limit).all()
class PortalAdminController(IController): name = 'portal' url_rules = [ Rule('/tag/new/', defaults={'slug': None}, endpoint='tag_edit'), Rule('/tag/<slug>/edit', endpoint='tag_edit'), Rule('/tag/<slug>/delete', endpoint='tag_delete'), ] @view('tag_edit') @templated('portal/admin/tag_edit.html') def tags_edit(self, request, slug=None): new = slug is None if new: tag, data = Tag(), {} else: tag = Tag.query.filter_by(slug=slug).one() data = model_to_dict(tag, exclude=('slug')) form = EditTagForm(request.form, **data) if 'delete' in request.form: return redirect_to('portal/tag_delete', slug=tag.slug) elif form.validate_on_submit(): tag = update_model(tag, form, ('name')) db.session.commit() if new: request.flash(_(u'Created tag “%s”' % tag.name), True) else: request.flash(_(u'Updated tag “%s”' % tag.name), True) return { 'form': form, 'tag': tag, } @view('tag_delete') def tags_delete(self, request, slug): message = _(u'Do you really want to delete this tag?') tag = Tag.query.filter_by(slug=slug).one() if confirm_action(request, message, 'portal/tag_delete', slug=slug): db.session.delete(tag) db.session.commit() request.flash(_(u'The tag “%s” was deleted successfully.' % tag.name)) return redirect_to('portal/tags') return redirect_to(tag)
class PortalServiceController(IServiceProvider): component = 'portal' url_rules = [ Rule('/get_random_password/', endpoint='get_random_password'), ] @service('get_random_password') def get_random_password(self, request): return {'password': get_random_password()}
class PasteController(IController): name = 'paste' url_rules = [ Rule('/', endpoint='index'), Rule('/paste/<int:id>/', endpoint='view'), Rule('/paste/<int:id>/', endpoint='edit'), Rule('/raw/<int:id>/', endpoint='raw'), Rule('/browse/', defaults={'page': 1}, endpoint='browse'), Rule('/browse/<int:page>/', endpoint='browse'), Rule('/compare/', endpoint='compare_paste'), Rule('/compare/<int:new_id>/<int:old_id>/', endpoint='compare_paste'), Rule('/unidiff/<int:new_id>/<int:old_id>/', endpoint='unidiff_paste'), Rule('/tree/<int:id>/', endpoint='show_tree'), ] @view @templated('paste/index.html', modifier=context_modifier) def index(self, request): form = AddPasteForm(request.form) if form.validate_on_submit(): e = PasteEntry(text=form.text.data, language=form.language.data or None, title=form.title.data, author=request.user) if form.parent.data: e.parent_id = form.parent.data db.session.commit() return redirect_to(e) parent_id = request.args.get('reply_to', None) if parent_id is not None and parent_id.isdigit(): parent = PasteEntry.query.get(int(parent_id)) form = AddPasteForm( **{ 'title': parent.title, 'language': parent.language, 'text': parent.text, 'parent': parent.id }) return { 'form': form, } @view('view') @templated('paste/view.html', modifier=context_modifier) def view_paste(self, request, id): e = PasteEntry.query.get(id) return { 'paste': e, } @view('edit') @templated('paste/admin/edit.html') def edit_paste(self, request, id): entry = PasteEntry.query.get(id) form = EditPasteForm( request.form, **model_to_dict(entry, exclude=('id', 'author_id'))) if form.validate_on_submit(): entry = update_model( entry, form, ('text', 'language', 'title', 'author', 'hidden')) db.session.commit() return redirect_to(entry) return { 'paste': entry, 'form': form, } @view('raw') def raw_paste(self, request, id): e = PasteEntry.query.get(id) return Response(e.text, mimetype='text/plain') @view('browse') @templated('paste/browse.html', modifier=context_modifier) def browse_pastes(self, request, page): query = PasteEntry.query pagination = URLPagination(query, page=page) return { 'pastes': pagination.query, 'pagination': pagination, } @view('show_tree') @templated('paste/paste_tree.html', modifier=context_modifier) def show_tree(self, request, id): """Display the tree of some related pastes.""" paste = PasteEntry.resolve_root(id) if paste is None: raise exc.NotFound() return {'paste': paste, 'current': id} @view('compare_paste') @templated('paste/compare_paste.html', modifier=context_modifier) def compare_paste(self, request, new_id=None, old_id=None): """Render a diff view for two pastes.""" old = PasteEntry.query.get(old_id) new = PasteEntry.query.get(new_id) if old is None or new is None: raise exc.NotFound() return { 'old': old, 'new': new, 'diff': old.compare_to(new, 'text', template=True) } @view('unidiff_paste') def unidiff_paste(self, request, new_id=None, old_id=None): """Render an udiff for the two pastes.""" old = PasteEntry.query.get(old_id) new = PasteEntry.query.get(new_id) if old is None or new is None: raise exc.NotFound() return Response(old.compare_to(new, 'text'), mimetype='text/plain')
class ForumController(IController): name = 'forum' url_rules = [ Rule('/', endpoint='index'), Rule('/questions/', endpoint='questions'), Rule('/questions/<int:page>/', endpoint='questions'), Rule('/questions/<any(latest, active, unanswered, votes):sort>/', endpoint='questions'), Rule('/questions/<any(latest, active, unanswered, votes):sort>/' \ '<int:page>/', endpoint='questions'), Rule('/tagged/<string:tags>/', endpoint='questions'), Rule('/tagged/<string:tags>/<int:page>/', endpoint='questions'), Rule('/tagged/<string:tags>/' \ '<any(latest, active, unanswered, votes):sort>/', endpoint='questions'), Rule('/tagged/<string:tags>/' \ '<any(latest, active, unanswered, votes):sort>/<int:page>/', endpoint='questions'), Rule('/forum/<string:forum>/', endpoint='questions'), Rule('/forum/<string:forum>/<int:page>/', endpoint='questions'), Rule('/forum/<string:forum>/' \ '<any(latest, active, unanswered, votes):sort>/', endpoint='questions'), Rule('/forum/<string:forum>/' \ '<any(latest, active, unanswered, votes):sort>/<int:page>/', endpoint='questions'), Rule('/forum/<string:forum>/add/', endpoint='edit_forum'), Rule('/forum/<string:forum>/edit/', endpoint='edit_forum'), Rule('/question/<string:slug>/', endpoint='question'), Rule('/question/<string:slug>/<int:page>/', endpoint='question'), Rule('/question/<string:slug>/<any(votes, latest, oldest):sort>/', endpoint='question'), Rule('/question/<string:slug>/<any(votes, latest, oldest):sort>/<int:page>/', endpoint='question'), Rule('/post/<int:posting_id>/', endpoint='posting'), Rule('/vote/<int:entry_id>/<string:action>/', endpoint='vote'), Rule('/ask/', endpoint='ask'), Rule('/forum/<string:forum>/ask/', endpoint='ask'), Rule('/answer/<int:entry_id>/', endpoint='answer'), Rule('/answer/<int:entry_id>/<any(edit):action>/', endpoint='answer'), ] @view('index') @templated('forum/index.html', modifier=context_modifier) def index(self, request): forums = Forum.query.filter_by(parent=None).all() return {'forums': forums} @view('questions') @templated('forum/questions.html', modifier=context_modifier) def questions(self, request, forum=None, tags=None, sort='latest', page=1): query = Question.query # Filter by Forum or Tag (optionally) if forum: forum = Forum.query.filter_by(slug=forum).first() query = query.forum(forum) tags = forum.all_tags elif tags: tags = (t.lower() for t in tags.split(',')) tags = Tag.query.public().filter(Tag.slug.in_(tags)).all() query = query.tagged(tags) # Order by "latest", "active", "unanswered" or "votes" query = getattr(query, sort) # Paginate results pagination = URLPagination(query, page) return { 'forum': forum, 'tags': tags or [], 'questions': pagination.query, 'sort': sort, 'pagination': pagination } @view('question') @templated('forum/question.html', modifier=context_modifier) 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 } @view('posting') def posting(self, request, posting_id=None): entry = ForumEntry.query.get(posting_id) return redirect_to(entry) @login_required @view('ask') @templated('forum/ask.html', modifier=context_modifier) def ask(self, request, forum=None): tags = [] if request.args.get('tags'): tags = ifilter(bool, (Tag.query.public().filter_by(slug=t).one() \ for t in request.args.get('tags').split())) elif forum: forum = Forum.query.filter_by(slug=forum).one() tags = forum.tags form = AskQuestionForm(request.form, tags=tags) if form.validate_on_submit(): question = Question(title=form.title.data, author=request.user, text=form.text.data, tags=form.tags.data) db.session.commit() return redirect_to(question) return {'forum': forum, 'tags': tags, 'form': form} @view('answer') @templated('forum/answer.html', modifier=context_modifier) def answer(self, request, entry_id, action=None): answer = Answer.query.get(entry_id) if action == 'edit': form = AnswerQuestionForm(request.form, text=answer.text) if form.validate_on_submit(): answer.text = form.text.data db.session.commit() return redirect_to(answer) return {'form': form} else: kwargs = {'_anchor': 'answer-%s' % answer.id} return redirect_to(answer.question, **kwargs) @login_required @view def vote(self, request, entry_id, action): entry = ForumEntry.query.get(entry_id) if entry.author == request.user: raise Forbidden v = Vote.query.filter_by(entry=entry, user=request.user).first() args = { 'up': { 'score': +1 }, 'down': { 'score': -1 }, 'revoke': { 'score': 0 }, 'favorite': { 'favorite': True }, 'nofavorite': { 'favorite': False } }[action] if not v: args.update({ 'score': args.get('score', 0), 'user': request.user, }) v = Vote(**args) v.entry = entry else: for key, a in args.iteritems(): setattr(v, key, a) db.session.commit() return redirect_to(entry) @view @login_required @templated('forum/admin/forum.html') def edit_forum(self, request, forum=None): if forum: forum = Forum.query.filter_by(slug=forum).first() initial = model_to_dict(forum) else: forum = None initial = {} form = EditForumForm(request.form, **initial) if form.validate_on_submit(): if forum: forum = update_model( forum, form, ('name', 'slug', 'parent', 'description', 'tags')) else: forum = Forum(name=form.name.data, slug=form.slug.data, parent=form.parent.data, description=form.description.data, tags=form.tags.data) db.session.commit() return redirect_to('forum/index') return { 'forum': forum, 'form': form, }
def url_rules(self): url_rules = [ Rule('/', endpoint='index'), Rule('/feed.atom', endpoint='article_feed', defaults={'slug': None}), Rule('/+<any(subscribe, unsubscribe):action>', endpoint='subscribe_articles'), Rule('/<int:page>/', endpoint='index'), Rule('/tag/<slug>/', endpoint='index'), Rule('/tag/<slug>/<int:page>/', endpoint='index'), Rule('/tag/<slug>/feed.atom', endpoint='article_feed'), Rule('/<slug>/', endpoint='detail'), Rule('/<slug>/+<any(subscribe, unsubscribe):action>', endpoint='subscribe_comments'), Rule('/comment/<int:id>/<any(hide, restore, edit):action>', endpoint='edit_comment'), Rule('/archive/', endpoint='archive'), ] # add the more complex url rule for archive and show post tmp = '/archive/' for digits, part in izip((4, 2, 2), ('year', 'month', 'day')): tmp += '<int(fixed_digits=%d):%s>/' % (digits, part) url_rules.extend([ Rule(tmp, defaults={'page': 1}, endpoint='archive'), Rule(tmp + 'page/<int:page>/', endpoint='archive'), ]) return url_rules
class EventController(IController): name = 'event' url_rules = [ Rule('/', endpoint='index'), Rule('/event/<int:id>/', endpoint='view'), Rule('/calendar/', endpoint='calendar'), Rule('/calendar/<int:year>/', endpoint='calendar'), Rule('/calendar/<int:year>/<int:month>/', endpoint='calendar'), Rule('/oncoming/', endpoint='oncoming'), Rule('/oncoming/<int:year>/', endpoint='oncoming'), Rule('/oncoming/<int:year>/<int:month>/', endpoint='oncoming'), ] @view @templated('event/index.html', modifier=context_modifier) 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, } @view('view') @templated('event/view.html', modifier=context_modifier) def view_event(self, request, id): e = Event.query.get(id) return { 'event': e, } @view('oncoming') @templated('event/oncoming.html', modifier=context_modifier) def oncoming_events(self, request, year=None, month=None): events = Event.query.oncoming(validate_year(year), validate_month(month), 10000) return { 'events': events, } @view('calendar') @templated('event/calendar.html', modifier=context_modifier) def calendar_events(self, request, year=None, month=None): year = validate_year(year) month = validate_month(month) day = date.today().day first_weekday_this_month = date(year, month, 1).weekday() if month == 1: pre = date(year - 1, 12, 1) post = date(year, 2, 1) elif month == 12: pre = date(year, 11, 1) post = date(year + 1, 1, 1) else: pre = date(year, month - 1, 1) post = date(year, month + 1, 1) days_in_premonth = calendar.monthrange(pre.year, pre.month)[1] days_in_month = calendar.monthrange(year, month)[1] #if month == 12: # days_in_postmonth = calendar.monthrange(year - 1, 1)[1] #else: # days_in_postmonth = calendar.monthrange(year, month + 1)[1] month_begin = date(year, month, 1) month_end = month_begin + timedelta(days_in_month) events = Event.query.during(month_begin, month_end) return { 'events': events, 'monthstart': first_weekday_this_month, 'days_in_premonth': days_in_premonth, 'days_in_month': days_in_month, 'today': date.today(), 'month_range': daterange(month_begin, month_end), 'current': date(year, month, 1), 'pre': pre, 'post': post, }