示例#1
0
def markup(body, obj=None, context=None):
    for preprocessor in defaults.PYBB_MARKUP_PREPROCESSORS:
        body = load_class(preprocessor)(body, obj=obj).render()

    body = load_class(defaults.PYBB_MARKUP_ENGINE)(body, obj=obj).render(context)

    for postprocessor in defaults.PYBB_MARKUP_POSTPROCESSORS:
        body = load_class(postprocessor)(body, obj=obj).render()

    return body
示例#2
0
文件: __init__.py 项目: thoas/pybbm
    def init_formatters(self):
        simple_formatters = list(self.simple_formatters.items()) + list(defaults.PYBB_BBCODE_MARKUP_SIMPLE_FORMATTERS)

        for tag_name, (format_str, context) in simple_formatters:
            if context:
                self.parser.add_simple_formatter(tag_name, format_str, **context)
            else:
                self.parser.add_simple_formatter(tag_name, format_str)

        formatters = list(self.formatters.items()) + list(defaults.PYBB_BBCODE_MARKUP_FORMATTERS)

        for tag_name, (formatter_name, context) in formatters:
            if context:
                self.parser.add_formatter(tag_name, load_class(formatter_name), **context)
            else:
                self.parser.add_formatter(tag_name, load_class(formatter_name))
示例#3
0
文件: views.py 项目: thoas/pybbm
    def post(self, request, *args, **kwargs):
        try:
            topic = Topic.objects.get(pk=request.POST['topic_id'])

            post = topic.posts.filter_by_user(topic, request.user).get(pk=request.POST['post_id'])
        except (Topic.DoesNotExist, Post.DoesNotExist, ValueError):
            raise Http404
        else:
            result = all([load_class(pre_post_create_filter)(
                topic=topic,
                request=request,
                forum=topic.forum,
            ).is_allowed(request.user) for pre_post_create_filter in defaults.PYBB_PRE_POST_CREATE_FILTERS])

            if not result:
                raise PermissionDenied

            session_key = make_session_key(topic)

            post_ids = request.session.get(session_key, [])

            if post.pk in post_ids:
                post_ids.remove(post.pk)
            else:
                post_ids.append(post.pk)

            request.session[session_key] = post_ids

            if request.is_ajax():
                return HttpResponse('Ok')

            return redirect(post.get_anchor_url(request.user))
示例#4
0
    def clean_body(self):
        body = self.cleaned_data['body']
        user = self.user or self.instance.user
        if defaults.PYBB_BODY_VALIDATOR:
            defaults.PYBB_BODY_VALIDATOR(user, body)

        for cleaner_class in defaults.PYBB_BODY_CLEANERS:
            body = load_class(cleaner_class)(user, body)
        return body
示例#5
0
    def clean_body(self):
        body = self.cleaned_data['body']
        user = self.user or self.instance.user
        if defaults.PYBB_BODY_VALIDATOR:
            defaults.PYBB_BODY_VALIDATOR(user, body)

        for cleaner_class in defaults.PYBB_BODY_CLEANERS:
            body = load_class(cleaner_class)(user, body)
        return body
示例#6
0
    def init_formatters(self):
        simple_formatters = list(self.simple_formatters.items()) + list(
            defaults.PYBB_BBCODE_MARKUP_SIMPLE_FORMATTERS)

        for tag_name, (format_str, context) in simple_formatters:
            if context:
                self.parser.add_simple_formatter(tag_name, format_str,
                                                 **context)
            else:
                self.parser.add_simple_formatter(tag_name, format_str)

        formatters = list(self.formatters.items()) + list(
            defaults.PYBB_BBCODE_MARKUP_FORMATTERS)

        for tag_name, (formatter_name, context) in formatters:
            if context:
                self.parser.add_formatter(tag_name, load_class(formatter_name),
                                          **context)
            else:
                self.parser.add_formatter(tag_name, load_class(formatter_name))
示例#7
0
def get_topic_delete_formset(topics, form=TopicDeleteForm):
    class BaseTopicDeleteFormSet(BaseFormSet):
        def __init__(self, *args, **kwargs):
            self.topics = topics

            super(BaseTopicDeleteFormSet, self).__init__(*args, **kwargs)

        def _construct_form(self, i, **kwargs):
            kwargs['topic'] = self.topics[i]

            return super(BaseTopicDeleteFormSet, self)._construct_form(i, **kwargs)

    return formset_factory(extra=len(topics), form=load_class(defaults.PYBB_TOPIC_DELETE_FORM), formset=BaseTopicDeleteFormSet)
示例#8
0
def get_topic_delete_formset(topics, form=TopicDeleteForm):
    class BaseTopicDeleteFormSet(BaseFormSet):
        def __init__(self, *args, **kwargs):
            self.topics = topics

            super(BaseTopicDeleteFormSet, self).__init__(*args, **kwargs)

        def _construct_form(self, i, **kwargs):
            kwargs['topic'] = self.topics[i]

            return super(BaseTopicDeleteFormSet,
                         self)._construct_form(i, **kwargs)

    return formset_factory(extra=len(topics),
                           form=load_class(defaults.PYBB_TOPIC_DELETE_FORM),
                           formset=BaseTopicDeleteFormSet)
示例#9
0
文件: pybb_tags.py 项目: thoas/pybbm
    def render(self, context):
        context_time = self.time.resolve(context)

        delta = tznow() - context_time
        today = tznow().replace(hour=0, minute=0, second=0)
        yesterday = today - timedelta(days=1)
        tomorrow = today + timedelta(days=1)

        if delta.days == 0:
            if delta.seconds < 60:
                if context['LANGUAGE_CODE'].startswith('ru') and pytils_enabled:
                    msg = _('seconds ago,seconds ago,seconds ago')
                    msg = pytils.numeral.choose_plural(delta.seconds, msg)
                else:
                    msg = _('seconds ago')
                return u'%d %s' % (delta.seconds, msg)

            elif delta.seconds < 3600:
                minutes = int(delta.seconds / 60)
                if context['LANGUAGE_CODE'].startswith('ru') and pytils_enabled:
                    msg = _('minutes ago,minutes ago,minutes ago')
                    msg = pytils.numeral.choose_plural(minutes, msg)
                else:
                    msg = _('minutes ago')
                return u'%d %s' % (minutes, msg)
        if context['user'].is_authenticated:
            if time.daylight:
                tz1 = time.altzone
            else:
                tz1 = time.timezone

            default_tz = load_class(defaults.PYBB_TIMEZONE_FROM_USER)(context['user'])

            tz = tz1 + default_tz * 60 * 60
            context_time = context_time + timedelta(seconds=tz)
        if today < context_time < tomorrow:
            return _('today, %s') % context_time.strftime('%H:%M')

        if yesterday < context_time < today:
            return _('yesterday, %s') % context_time.strftime('%H:%M')

        return dateformat.format(context_time, 'd M, Y H:i')
示例#10
0
    def post(self, request, *args, **kwargs):
        try:
            topic = Topic.objects.get(pk=request.POST['topic_id'])

            post = topic.posts.filter_by_user(
                topic, request.user).get(pk=request.POST['post_id'])
        except (Topic.DoesNotExist, Post.DoesNotExist, ValueError):
            raise Http404
        else:
            result = all([
                load_class(pre_post_create_filter)(
                    topic=topic,
                    request=request,
                    forum=topic.forum,
                ).is_allowed(request.user) for pre_post_create_filter in
                defaults.PYBB_PRE_POST_CREATE_FILTERS
            ])

            if not result:
                raise PermissionDenied

            session_key = make_session_key(topic)

            post_ids = request.session.get(session_key, [])

            if post.pk in post_ids:
                post_ids.remove(post.pk)
            else:
                post_ids.append(post.pk)

            request.session[session_key] = post_ids

            if request.is_ajax():
                return HttpResponse('Ok')

            return redirect(post.get_anchor_url(request.user))
示例#11
0
def quote(post, username):
    return load_class(defaults.PYBB_QUOTE_ENGINE)(post, username).render()
示例#12
0
from pybb.contrib.search import settings
from pybb.util import load_class

SearchForm = load_class(settings.PYBB_SEARCH_SEARCH_FORM)
示例#13
0
文件: base.py 项目: thoas/pybbm
        forms_cnt = len(self.initial_forms) + len([form for form in self.extra_forms if form.has_changed()]) - len(self.deleted_forms)

        if forms_cnt > defaults.PYBB_POLL_MAX_ANSWERS:
            raise forms.ValidationError(_('You can''t add more than %s answers for poll') % defaults.PYBB_POLL_MAX_ANSWERS)

        if forms_cnt < 2:
            raise forms.ValidationError(_('Add two or more answers for this poll'))


PollAnswerFormSet = inlineformset_factory(Poll, PollAnswer, extra=2, max_num=defaults.PYBB_POLL_MAX_ANSWERS,
                                          form=PollAnswerForm, formset=BasePollAnswerFormset)


pybb_premoderation = None
if defaults.PYBB_PREMODERATION:
    pybb_premoderation = load_class(defaults.PYBB_PREMODERATION)


class PostForm(forms.ModelForm):
    error_messages = {
        'duplicate': _("A topic with that name already exists."),
    }

    name = forms.CharField(label=_('Subject'))

    body = forms.CharField(label=_('Message'),
                           widget=forms.Textarea(attrs={'class': 'pretty_editor'}))

    hash = forms.CharField(label=_('Hash'),
                           widget=forms.HiddenInput())
示例#14
0
from pybb import defaults
from pybb.util import load_class

AttachmentForm = load_class(defaults.PYBB_ATTACHMENT_FORM)

PollAnswerForm = load_class(defaults.PYBB_POLL_ANSWER_FORM)

PollAnswerFormSet = load_class(defaults.PYBB_POLL_ANSWER_FORM_SET)

PostForm = load_class(defaults.PYBB_POST_FORM)

AdminPostForm = load_class(defaults.PYBB_ADMIN_POST_FORM)

AdminPostForm.__bases__ = (PostForm, )

UserSearchForm = load_class(defaults.PYBB_USER_SEARCH_FORM)

PollForm = load_class(defaults.PYBB_POLL_FORM)

ForumForm = load_class(defaults.PYBB_FORUM_FORM)

ModerationForm = load_class(defaults.PYBB_MODERATION_FORM)

SearchUserForm = load_class(defaults.PYBB_SEARCH_USER_FORM)

AttachmentFormSet = load_class(defaults.PYBB_ATTACHMENT_FORM_SET)

TopicMergeForm = load_class(defaults.PYBB_TOPIC_MERGE_FORM)

TopicMoveForm = load_class(defaults.PYBB_TOPIC_MOVE_FORM)
示例#15
0
from pybb import defaults

from pybb.util import load_class

IndexView = load_class(defaults.PYBB_INDEX_VIEW)
ForumCreateView = load_class(defaults.PYBB_FORUM_CREATE_VIEW)
ForumDetailView = load_class(defaults.PYBB_FORUM_DETAIL_VIEW)
ForumUpdateView = load_class(defaults.PYBB_FORUM_UPDATE_VIEW)
LogModerationListView = load_class(defaults.PYBB_LOG_MODERATION_VIEW)
TopicDetailView = load_class(defaults.PYBB_TOPIC_DETAIL_VIEW)
PostsMoveView = load_class(defaults.PYBB_POSTS_MOVE_VIEW)
PostCreateView = load_class(defaults.PYBB_POST_CREATE_VIEW)
PostsCreateView = load_class(defaults.PYBB_POSTS_CREATE_VIEW)
PostUpdateView = load_class(defaults.PYBB_POST_UPDATE_VIEW)
PostRedirectView = load_class(defaults.PYBB_POST_REDIRECT_VIEW)
PostModerateView = load_class(defaults.PYBB_POST_MODERATE_VIEW)
PostDeleteView = load_class(defaults.PYBB_POST_DELETE_VIEW)
TopicDeleteView = load_class(defaults.PYBB_TOPIC_DELETE_VIEW)
TopicsDeleteView = load_class(defaults.PYBB_TOPICS_DELETE_VIEW)
TopicStickView = load_class(defaults.PYBB_TOPIC_STICK_VIEW)
TopicUnstickView = load_class(defaults.PYBB_TOPIC_UNSTICK_VIEW)
TopicCloseView = load_class(defaults.PYBB_TOPIC_CLOSE_VIEW)
TopicMergeView = load_class(defaults.PYBB_TOPIC_MERGE_VIEW)
TopicMoveView = load_class(defaults.PYBB_TOPIC_MOVE_VIEW)
TopicOpenView = load_class(defaults.PYBB_TOPIC_OPEN_VIEW)
TopicTrackerRedirectView = load_class(defaults.PYBB_TOPIC_TRACKER_REDIRECT_VIEW)
TopicPollVoteView = load_class(defaults.PYBB_TOPIC_POLL_VOTE_VIEW)
ModeratorListView = load_class(defaults.PYBB_MODERATOR_LIST_VIEW)
ModeratorDetailView = load_class(defaults.PYBB_MODERATOR_DETAIL_VIEW)
ModeratorCreateView = load_class(defaults.PYBB_MODERATOR_CREATE_VIEW)
ModeratorDeleteView = load_class(defaults.PYBB_MODERATOR_DELETE_VIEW)
示例#16
0
from pybb import defaults

from pybb.util import load_class

IndexView = load_class(defaults.PYBB_INDEX_VIEW)
ForumCreateView = load_class(defaults.PYBB_FORUM_CREATE_VIEW)
ForumDetailView = load_class(defaults.PYBB_FORUM_DETAIL_VIEW)
ForumUpdateView = load_class(defaults.PYBB_FORUM_UPDATE_VIEW)
LogModerationListView = load_class(defaults.PYBB_LOG_MODERATION_VIEW)
TopicDetailView = load_class(defaults.PYBB_TOPIC_DETAIL_VIEW)
PostsMoveView = load_class(defaults.PYBB_POSTS_MOVE_VIEW)
PostCreateView = load_class(defaults.PYBB_POST_CREATE_VIEW)
PostsCreateView = load_class(defaults.PYBB_POSTS_CREATE_VIEW)
PostUpdateView = load_class(defaults.PYBB_POST_UPDATE_VIEW)
PostRedirectView = load_class(defaults.PYBB_POST_REDIRECT_VIEW)
PostModerateView = load_class(defaults.PYBB_POST_MODERATE_VIEW)
PostDeleteView = load_class(defaults.PYBB_POST_DELETE_VIEW)
TopicDeleteView = load_class(defaults.PYBB_TOPIC_DELETE_VIEW)
TopicsDeleteView = load_class(defaults.PYBB_TOPICS_DELETE_VIEW)
TopicStickView = load_class(defaults.PYBB_TOPIC_STICK_VIEW)
TopicUnstickView = load_class(defaults.PYBB_TOPIC_UNSTICK_VIEW)
TopicCloseView = load_class(defaults.PYBB_TOPIC_CLOSE_VIEW)
TopicMergeView = load_class(defaults.PYBB_TOPIC_MERGE_VIEW)
TopicMoveView = load_class(defaults.PYBB_TOPIC_MOVE_VIEW)
TopicOpenView = load_class(defaults.PYBB_TOPIC_OPEN_VIEW)
TopicTrackerRedirectView = load_class(
    defaults.PYBB_TOPIC_TRACKER_REDIRECT_VIEW)
TopicPollVoteView = load_class(defaults.PYBB_TOPIC_POLL_VOTE_VIEW)
ModeratorListView = load_class(defaults.PYBB_MODERATOR_LIST_VIEW)
ModeratorDetailView = load_class(defaults.PYBB_MODERATOR_DETAIL_VIEW)
ModeratorCreateView = load_class(defaults.PYBB_MODERATOR_CREATE_VIEW)
示例#17
0
from pybb import defaults
from pybb.util import load_class

from pybb.models.base import BaseTopicRedirection, PostDeletion  # NOQA


class TopicRedirection(BaseTopicRedirection):
    class Meta(BaseTopicRedirection.Meta):
        abstract = False


Moderator = load_class(defaults.PYBB_MODERATOR_MODEL)
Forum = load_class(defaults.PYBB_FORUM_MODEL)
Post = load_class(defaults.PYBB_POST_MODEL)
Topic = load_class(defaults.PYBB_TOPIC_MODEL)
TopicReadTracker = load_class(defaults.PYBB_TOPIC_READ_TRACKER_MODEL)
ForumReadTracker = load_class(defaults.PYBB_FORUM_READ_TRACKER_MODEL)
PollAnswer = load_class(defaults.PYBB_POLL_ANSWER_MODEL)
PollAnswerUser = load_class(defaults.PYBB_POLL_ANSWER_USER_MODEL)
LogModeration = load_class(defaults.PYBB_LOG_MODERATION_MODEL)
Attachment = load_class(defaults.PYBB_ATTACHMENT_MODEL)
Poll = load_class(defaults.PYBB_POLL_MODEL)
Subscription = load_class(defaults.PYBB_SUBSCRIPTION_MODEL)


Forum.on_change(Forum.watch_forum)

Post.on_change(Post.watch_topic)

from pybb.receivers import *
示例#18
0
def quote(post, username):
    return load_class(defaults.PYBB_QUOTE_ENGINE)(post, username).render()
示例#19
0
from pybb.contrib.search import settings
from pybb.util import load_class

SearchView = load_class(settings.PYBB_SEARCH_SEARCH_VIEW)
示例#20
0
        if forms_cnt < 2:
            raise forms.ValidationError(
                _('Add two or more answers for this poll'))


PollAnswerFormSet = inlineformset_factory(
    Poll,
    PollAnswer,
    extra=2,
    max_num=defaults.PYBB_POLL_MAX_ANSWERS,
    form=PollAnswerForm,
    formset=BasePollAnswerFormset)

pybb_premoderation = None
if defaults.PYBB_PREMODERATION:
    pybb_premoderation = load_class(defaults.PYBB_PREMODERATION)


class PostForm(forms.ModelForm):
    error_messages = {
        'duplicate': _("A topic with that name already exists."),
    }

    name = forms.CharField(label=_('Subject'))

    body = forms.CharField(
        label=_('Message'),
        widget=forms.Textarea(attrs={'class': 'pretty_editor'}))

    hash = forms.CharField(label=_('Hash'), widget=forms.HiddenInput())