コード例 #1
0
ファイル: services.py プロジェクト: cgnkev/inyoka-legacy
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)
コード例 #2
0
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')
コード例 #3
0
ファイル: services.py プロジェクト: cgnkev/inyoka-legacy
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()
コード例 #4
0
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()
コード例 #5
0
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)
コード例 #6
0
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()}
コード例 #7
0
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')
コード例 #8
0
ファイル: controllers.py プロジェクト: cgnkev/inyoka-legacy
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,
        }
コード例 #9
0
ファイル: controllers.py プロジェクト: cgnkev/inyoka-legacy
    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
コード例 #10
0
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,
        }