Exemple #1
0
def detail(request, id, slug):

    event = get_object_or_404(Event, pk=id)

    parent = helpers.get_obj(ct=event.content_type, id=event.object_id)
    if not helpers.is_visible(request.user, parent):
        return render_to_response('denied.html', context_instance=RequestContext(request))

    # create whiteboard if needed
    member = False
    if event.whiteboard == None:
        # this will fail if the event's parent is not a group... 
        # so, only events attached to a group can have a whiteboard.
        try:
            method = getattr(event.content_object, "associate")
            wb = Article(title="Event%d" % (event.id), content="")
            event.content_object.associate(wb, commit=False)
            wb.save()
            event.whiteboard = wb
            event.save()
            
            # FIXME: we assume if you can see the event, you can edit it
            member = True
        except:
            pass

    return render_to_response("events/event_detail.html",
                               { 'object': event,
                                'member': member,
                               },
                               context_instance=RequestContext(request),
                             )
Exemple #2
0
    def test_manager(self):

        article = Article()
        article.add_revision(ArticleRevision(title="Root",
                                             content="Hello\nworld"),
                             save=True)
        self.assertEqual("Hello\r\nworld", article.current_revision.content)
Exemple #3
0
def old_create_wiki(wiki):
    tags = wiki['tags']
    admin = User.objects.first()
    root = Article.objects.first().urlpath_set.first()

    slug_list = deque(wiki["root"].split("/")[1:])
    parent = traverse_ancestors(root, slug_list)

    # create Article
    article = Article(owner=admin, )
    article.save()

    # create URLPath
    urlpath = URLPath(parent=parent,
                      article=article,
                      slug=wiki['slug'],
                      site_id=1)
    urlpath.save()

    # add URLPath to Article
    article.urlpath_set.add(urlpath)

    article_revision = ArticleRevision(
        article=article,
        title=wiki['name'],
        #long_name=wiki['long_name'],
        content=wiki['content'],
        revision_number=1)

    # save wiki
    article_revision.save()
Exemple #4
0
 def handle(self, *args, **options):
     fake = Factory.create()
     for i in range(10):
         a = Article(
             name=fake.company(),
             body=fake.text(max_nb_chars=500),
         )
         a.save()
Exemple #5
0
def group_detail(request, group_slug, model=None, member_model=None,
                 form_class=None,  template_name=None, edit_template_name=None,
                 options=None):
    """
    View details of a group
    """
    
    # how would we ever get here...??? (is this check redundant?)
    if model is None:
        # find group type and redirect
        group = get_object_or_404(BaseGroup, slug=group_slug)
        return HttpResponseRedirect(reverse("%s_detail" % group.model.lower(), kwargs={'group_slug': group_slug}))
    
    # keep this here to be RESTful (allow POST to object for editing)
    if request.method == 'POST':
        return edit_group(request, group_slug, model=model,
                          member_model=member_model, form_class=form_class,
                          template_name=edit_template_name,
                          detail_template_name=template_name, options=options)

    # get group
    group = get_object_or_404(model, slug=group_slug)

    # membership status
    if group.user_is_member(request.user):
        member = group.members.get(user=request.user)
    elif group.user_is_pending_member(request.user):
        member = group.pending_members.get(user=request.user)
    else:
        member = None
        
    # retrieve whiteboard (create if needed)
    if group.whiteboard == None:
        wb = Article(title="Whiteboard", content="")
        group.associate(wb, commit=False)
        wb.save()
        group.whiteboard = wb
        group.save()
        
    # see if any admin tasks are outstanding
    # (should this only trigger for oustanding requets, instead of requests & invitations?)
    requests_outstanding = False
    if group.user_is_admin(request.user):
        if group.num_pending_members() > 0:
            requests_outstanding = True
    
    # render
    return render_to_response(
        template_name,
        {
            'group': group,                
            'children': group.get_visible_children(request.user),
            'is_admin': group.user_is_admin(request.user),
            'requests_outstanding': requests_outstanding,
            'joinform': GroupAddEmailForm()
        },
        context_instance=RequestContext(request)
    )
Exemple #6
0
    def __create_redirect_page(self):
        # Verify we're changing more than case
        if self.kwargs['namespace'].lower() == self.object.namespace.lower():
            if self.kwargs['slug'].lower() == self.object.slug.lower():
                return

        redirect = Article(
            title=self.object.title,
            is_published=self.object.is_published,
            is_nsfw=self.object.is_nsfw,
            is_spoiler=self.object.is_spoiler,
            **self.kwargs,
        )
        redirect.markdown = '[[REDIRECT:/{article}]]'.format(
            article=utils.join_path(self.object.namespace, self.object.slug), )
        redirect.save()
 def dispatch(self, request, tag, *args, **kwargs):
     self.tag = get_tag(tag)
     article = Article.get_for_object(self.tag)
     return super(TagEditWikiView, self).dispatch(request,
                                                  article_id=article.id,
                                                  *args,
                                                  **kwargs)
Exemple #8
0
 def form_valid(self, form):
     with transaction.atomic():
         self.article = Article(body=form.cleaned_data['body'])
         self.article.locale = self.request.LANGUAGE_CODE
         self.article.save()
         self.main_alias = Alias(
             name=form.cleaned_data['name'],
             article=self.article
         )
         self.main_alias.save()
     return super().form_valid(form)
Exemple #9
0
class NewArticleView(LoginRequiredMixin, FormView):

    form_class = NewArticleForm
    template_name = 'wiki/new_article.html'

    def form_valid(self, form):
        with transaction.atomic():
            self.article = Article(body=form.cleaned_data['body'])
            self.article.locale = self.request.LANGUAGE_CODE
            self.article.save()
            self.main_alias = Alias(
                name=form.cleaned_data['name'],
                article=self.article
            )
            self.main_alias.save()
        return super().form_valid(form)

    def get_success_url(self):
        return reverse_lazy('article-detail',
                            kwargs={'slug': self.main_alias.slug})
Exemple #10
0
def topic(request, topic_id, group_slug=None, edit=False, template_name="topics/topic.html", bridge=None):

    topic = get_object_or_404(GroupTopic, id=topic_id)
    
    parent_group = topic.parent_group
    # XXX PERMISSIONS CHECK
    if not parent_group.is_visible(request.user) and not topic.creator == request.user:
        return HttpResponseForbidden()

    # XXX PERMISSIONS CHECK
    # only the owner of a topic or a group admin can edit a topic (??)
    if (request.method == "POST" and edit == True and \
            topic.is_editable(request.user)):
        updated_body = request.POST.get('body', None)
        if updated_body is not None:
            topic.body = updated_body
            topic.save()
        return HttpResponseRedirect(topic.get_absolute_url())

    # retrieve whiteboard (create if needed)
    if topic.whiteboard == None:
        # group_slug should always be valid - group never null!
        wb = Article(title="Post%d" % (topic.id), content="")
        if topic.group:
            topic.group.associate(wb, commit=False)
        wb.save()
        topic.whiteboard = wb
        topic.save()
        
    member = False
    if topic.group and topic.group.user_is_member(request.user):
        member = True
        
    grpadmin = topic.group.user_is_admin(request.user)

    return render_to_response(template_name, {
        "topic": topic,
        "group": topic.group,
        "member": member,
        "grpadmin": grpadmin,
    }, context_instance=RequestContext(request))
Exemple #11
0
def edit_article(request, slug):
    article = None
    params = {}

    try:
        # Enables case-insentivity
        article = Article.objects.get(slug__iexact=slug)
        if article.slug != slug:
            return HttpResponseRedirect(reverse('edit_article', args=[article.slug]))
    except Article.DoesNotExist:
        title = slug.replace('_', ' ')
        article = Article(title=title, creator=request.user)

    if request.method == 'GET':

        # Check mutual exclusion
        lock = cache.get(article.title, None)
        if lock is None:
            lock = EditLock(article.title, request)
        elif not lock.is_mine(request):
            print "Possible editing conflict. Another user started editing", lock.created_at
            params['locked'] = xslt_param_builder("True")
            format = "%d %b %Y %H:%M:%S"
            params['lock_created'] = xslt_param_builder( lock.created_at.strftime(format) )

    elif request.method == 'POST':
        article.title = request.POST['title']
        article.content = request.POST['content']
        article.save()

        cache.delete(article.title)

        view_url = reverse('view_article', args=[article.slug])
        return HttpResponseRedirect(view_url)

    view_url = reverse('view_article', args=[slug])
    params['viewurl'] = xslt_param_builder(view_url)

    return render_to_response('edit_article.xsl', article, params)
Exemple #12
0
    def create_bot_wiki_article(self):
        article_kwargs = {'owner': self.user,
                          'group': None,
                          'group_read': True,
                          'group_write': False,
                          'other_read': True,
                          'other_write': False}
        article = Article(**article_kwargs)
        article.add_revision(ArticleRevision(title=self.name), save=True)
        article.save()

        self.wiki_article = article
Exemple #13
0
    def get_context_data(self, tag, **kwargs):
        context = super(TagPageView, self).get_context_data(**kwargs)

        current_site = Site.objects.get_current()
        current_language_code = translation.get_language()

        tag_instance = get_tag(tag)
        if tag_instance is None:
            raise Http404(_('No Tag found matching "%s".') % tag)

        try:
            article = Article.get_for_object(tag_instance)
        except ArticleForObject.DoesNotExist:
            # Get or create root
            try:
                root_path = URLPath.root()
            except NoRootURL:
                root_path = URLPath.create_root(site=current_site)

            # Get current language namespace. E.g. "/fr"
            try:
                language_ns_path = URLPath.get_by_path("/%s" % current_language_code)
            except URLPath.DoesNotExist:
                language_ns_path = URLPath.create_article(
                    parent=root_path,
                    slug=current_language_code,
                    site=current_site,
                    title=current_language_code
                )

            # Get or create the article
            from django.template.defaultfilters import slugify                
            tag_slug = slugify(tag_instance.name)
            try:
                article_path = URLPath.get_by_path("/%s/%s" % (current_language_code,
                                                               tag_slug)
                                                   )
            except URLPath.DoesNotExist:
                article_path = URLPath.create_article(
                    parent=language_ns_path,
                    slug=tag_slug,
                    site=current_site,
                    title=tag_instance.name
                )

            # Get the wiki article itself
            article = article_path.article
            article.add_object_relation(tag_instance)

        context['article'] = article

        # XXX: site not taken in account        
        context['tag'] = tag_instance
        context['related_tags'] = list(
            reversed(
                sorted(Tag.objects.related_for_model(tag_instance, 
                                                     I4pProjectTranslation,
                                                     counts=True),
                       key=attrgetter('count'),
                   )
            )
        )[:15]

        # Get project sheets tagged with this tag XXX: site=site may
        # not be correct 4 Random projects with at least one picture.
        # It's not possible to mix distinct and order by random, so
        # use a trick
        hilighted_projects= TaggedItem.objects.get_by_model(I4pProjectTranslation.objects.filter(
            language_code=current_language_code,            
            project__site=current_site,
            project__pictures__isnull=False
        ).distinct(), tag_instance).distinct()
        context['picture_project_translations'] = random.sample(hilighted_projects, min(4, len(hilighted_projects)))


        # Mature projects
        mature_project_translations = TaggedItem.objects.get_by_model(I4pProjectTranslation.objects.filter(
            language_code=current_language_code,
            project__site=current_site,
            project__status__in=('WIP', 'END')
        ).distinct(), tag_instance).distinct()
        context['mature_project_translations'] = random.sample(mature_project_translations, min(4, len(mature_project_translations)))

        # Starting projects
        starting_project_translations = TaggedItem.objects.get_by_model(I4pProjectTranslation.objects.filter(
            language_code=current_language_code,            
            project__site=current_site,
            project__status__in=('IDEA', 'BEGIN')
        ).distinct(), tag_instance).distinct()
        context['starting_project_translations'] = random.sample(starting_project_translations, min(4, len(starting_project_translations)))
         
        # New projects
        context['new_project_translations'] = TaggedItem.objects.get_by_model(I4pProjectTranslation.objects.filter(
            language_code=current_language_code,            
            project__site=current_site,
        ).distinct(), tag_instance).order_by('-project__created')[:4]
        
        # Latest modifications
        context['modified_project_translations'] = TaggedItem.objects.get_by_model(I4pProjectTranslation.objects.filter(
            language_code=current_language_code,            
            project__site=current_site,
        ).distinct(), tag_instance).order_by('-modified')[:4]

        # Related people
        project_translations = ModelTaggedItemManager().with_any([tag_instance.name],
                                                                 I4pProjectTranslation.objects.filter(
                                                                     language_code=current_language_code,
                                                                     project__site=current_site,
                                                                 )
                                                             ).distinct()
        projects = [p.project for p in project_translations]
        
        context['people'] = ProjectMember.objects.filter(
            project__in=projects
        ).order_by('?')[:6]

        return context
Exemple #14
0
 def dispatch(self, request, tag, *args, **kwargs):
     self.tag = get_tag(tag)        
     article = Article.get_for_object(self.tag)
     return super(TagEditWikiView, self).dispatch(request, article_id=article.id, *args, **kwargs)
Exemple #15
0
    def test_manager(self):

        article = Article()
        article.add_revision(ArticleRevision(title="Root", content="Hello\nworld"),
                             save=True)
        self.assertEqual("Hello\r\nworld", article.current_revision.content)
    def get_context_data(self, tag, **kwargs):
        context = super(TagPageView, self).get_context_data(**kwargs)

        current_site = Site.objects.get_current()
        current_language_code = translation.get_language()

        tag_instance = get_tag(tag)
        if tag_instance is None:
            raise Http404(_('No Tag found matching "%s".') % tag)

        try:
            article = Article.get_for_object(tag_instance)
        except ArticleForObject.DoesNotExist:
            # Get or create root
            try:
                root_path = URLPath.root()
            except NoRootURL:
                root_path = URLPath.create_root(site=current_site)

            # Get current language namespace. E.g. "/fr"
            try:
                language_ns_path = URLPath.get_by_path("/%s" %
                                                       current_language_code)
            except URLPath.DoesNotExist:
                language_ns_path = URLPath.create_article(
                    parent=root_path,
                    slug=current_language_code,
                    site=current_site,
                    title=current_language_code)

            # Get or create the article
            from django.template.defaultfilters import slugify
            tag_slug = slugify(tag_instance.name)
            try:
                article_path = URLPath.get_by_path(
                    "/%s/%s" % (current_language_code, tag_slug))
            except URLPath.DoesNotExist:
                article_path = URLPath.create_article(parent=language_ns_path,
                                                      slug=tag_slug,
                                                      site=current_site,
                                                      title=tag_instance.name)

            # Get the wiki article itself
            article = article_path.article
            article.add_object_relation(tag_instance)

        context['article'] = article

        # XXX: site not taken in account
        context['tag'] = tag_instance
        context['related_tags'] = list(
            reversed(
                sorted(
                    Tag.objects.related_for_model(tag_instance,
                                                  I4pProject,
                                                  counts=True),
                    key=attrgetter('count'),
                )))[:15]

        # Get project sheets tagged with this tag XXX: site=site may
        # not be correct 4 Random projects with at least one picture.
        # It's not possible to mix distinct and order by random, so
        # use a trick
        hilighted_projects = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(
                language_code=current_language_code,
                master__site=current_site,
                master__pictures__isnull=False).distinct(),
            tag_instance).distinct()
        context['picture_projects'] = random.sample(
            hilighted_projects, min(4, len(hilighted_projects)))

        # Mature projects
        mature_projects = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(
                master__site=current_site,
                master__status__in=('WIP', 'END')).distinct(),
            tag_instance).distinct()
        context['num_mature_projects_projects_with_tag'] = len(mature_projects)
        context['mature_projects'] = random.sample(
            mature_projects, min(4, len(mature_projects)))

        # Starting projects
        starting_projects = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(
                master__site=current_site,
                master__status__in=('IDEA', 'BEGIN')).distinct(),
            tag_instance).distinct()
        context['num_starting_projects_projects_with_tag'] = len(
            starting_projects)
        context['starting_projects'] = random.sample(
            starting_projects, min(4, len(starting_projects)))

        # New projects
        context['new_projects'] = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(
                master__site=current_site, ).distinct(),
            tag_instance).order_by('-master__created')[:4]

        # Latest modifications
        context['modified_projects'] = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(
                master__site=current_site, ).distinct(),
            tag_instance).order_by('-modified')[:4]

        # Related people
        # List is to force evaluation to avoid a sql bug in queryset combining later (project__in=projects)
        projects = list(
            TaggedItem.objects.get_by_model(
                I4pProject.objects.using_translations().filter(
                    master__site=current_site, ).distinct(),
                tag_instance).all())
        # While we're at it, let's count them for free
        context['num_projects_with_tag'] = len(projects)

        context['people'] = ProjectMember.objects.filter(
            project__in=projects).order_by('?')[:6]

        return context
    def get_context_data(self, tag, **kwargs):
        context = super(TagPageView, self).get_context_data(**kwargs)

        current_site = Site.objects.get_current()
        current_language_code = translation.get_language()

        tag_instance = get_tag(tag)
        if tag_instance is None:
            raise Http404(_('No Tag found matching "%s".') % tag)

        try:
            article = Article.get_for_object(tag_instance)
        except ArticleForObject.DoesNotExist:
            # Get or create root
            try:
                root_path = URLPath.root()
            except NoRootURL:
                root_path = URLPath.create_root(site=current_site)

            # Get current language namespace. E.g. "/fr"
            try:
                language_ns_path = URLPath.get_by_path("/%s" % current_language_code)
            except URLPath.DoesNotExist:
                language_ns_path = URLPath.create_article(
                    parent=root_path, slug=current_language_code, site=current_site, title=current_language_code
                )

            # Get or create the article
            from django.template.defaultfilters import slugify

            tag_slug = slugify(tag_instance.name)
            try:
                article_path = URLPath.get_by_path("/%s/%s" % (current_language_code, tag_slug))
            except URLPath.DoesNotExist:
                article_path = URLPath.create_article(
                    parent=language_ns_path, slug=tag_slug, site=current_site, title=tag_instance.name
                )

            # Get the wiki article itself
            article = article_path.article
            article.add_object_relation(tag_instance)

        context["article"] = article

        # XXX: site not taken in account
        context["tag"] = tag_instance
        context["related_tags"] = list(
            reversed(
                sorted(Tag.objects.related_for_model(tag_instance, I4pProject, counts=True), key=attrgetter("count"))
            )
        )[:15]

        # Get project sheets tagged with this tag XXX: site=site may
        # not be correct 4 Random projects with at least one picture.
        # It's not possible to mix distinct and order by random, so
        # use a trick
        hilighted_projects = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations()
            .filter(language_code=current_language_code, master__site=current_site, master__pictures__isnull=False)
            .distinct(),
            tag_instance,
        ).distinct()
        context["picture_projects"] = random.sample(hilighted_projects, min(4, len(hilighted_projects)))

        # Mature projects
        mature_projects = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations()
            .filter(master__site=current_site, master__status__in=("WIP", "END"))
            .distinct(),
            tag_instance,
        ).distinct()
        context["num_mature_projects_projects_with_tag"] = len(mature_projects)
        context["mature_projects"] = random.sample(mature_projects, min(4, len(mature_projects)))

        # Starting projects
        starting_projects = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations()
            .filter(master__site=current_site, master__status__in=("IDEA", "BEGIN"))
            .distinct(),
            tag_instance,
        ).distinct()
        context["num_starting_projects_projects_with_tag"] = len(starting_projects)
        context["starting_projects"] = random.sample(starting_projects, min(4, len(starting_projects)))

        # New projects
        context["new_projects"] = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(master__site=current_site).distinct(), tag_instance
        ).order_by("-master__created")[:4]

        # Latest modifications
        context["modified_projects"] = TaggedItem.objects.get_by_model(
            I4pProject.objects.using_translations().filter(master__site=current_site).distinct(), tag_instance
        ).order_by("-modified")[:4]

        # Related people
        # List is to force evaluation to avoid a sql bug in queryset combining later (project__in=projects)
        projects = list(
            TaggedItem.objects.get_by_model(
                I4pProject.objects.using_translations().filter(master__site=current_site).distinct(), tag_instance
            ).all()
        )
        # While we're at it, let's count them for free
        context["num_projects_with_tag"] = len(projects)

        context["people"] = ProjectMember.objects.filter(project__in=projects).order_by("?")[:6]

        return context