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), )
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 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()
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()
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) )
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)
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)
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})
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))
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)
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
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
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