def form_valid(self, form): self.can_write = True # only allowed users can change images context = self.get_context_data(**self.kwargs) img = self.object gallery = context['gallery'] if img.gallery != gallery: raise PermissionDenied can_change = True if 'physical' in self.request.FILES: # the user request to change the image if self.request.FILES["physical"].size > settings.ZDS_APP[ 'gallery']['image_max_size']: messages.error( self.request, _(u"Votre image est beaucoup trop lourde, réduisez sa taille à moins de {:.0f} " u"<abbr title=\"kibioctet\">Kio</abbr> avant de l'envoyer." ).format(settings.ZDS_APP['gallery']['image_max_size'] / 1024)) can_change = False else: img.physical = self.request.FILES["physical"] img.slug = slugify(self.request.FILES["physical"]) if can_change: img.title = form.cleaned_data['title'] img.legend = form.cleaned_data['legend'] img.update = datetime.now() img.save() return redirect( reverse("gallery-image-edit", args=[img.gallery.pk, img.pk]))
def slug(self): """ PrivateTopic doesn't have a slug attribute of a private topic. To be compatible with older private topic, the slug is always re-calculate when we need one. :return: title slugify. """ return slugify(self.title)
def save(self, *args, **kwargs): self.title = self.title.strip() if not self.title or not slugify(self.title.replace('-', '')): raise ValueError('Tag "{}" is not correct'.format(self.title)) self.title = smart_text(self.title).lower() self.slug = uuslug(self.title, instance=self, max_length=Tag._meta.get_field('slug').max_length) super(Tag, self).save(*args, **kwargs)
def new_image(request, gal_pk): ''' Creates a new image ''' gal = get_object_or_404(Gallery, pk=gal_pk) if request.method == 'POST': form = ImageForm(request.POST, request.FILES) if form.is_valid() \ and request.FILES['physical'].size < settings.IMAGE_MAX_SIZE: img = Image() img.physical = request.FILES['physical'] img.gallery = gal img.title = request.POST['title'] img.slug = slugify(request.FILES['physical']) img.legend = request.POST['legend'] img.pubdate = datetime.now() img.save() # Redirect to the document list after POST return redirect(gal.get_absolute_url()) else: # TODO: add errors to the form and return it raise Http404 else: form = ImageForm() # A empty, unbound form return render_template('gallery/new_image.html', { 'form': form, 'gallery': gal })
def get(self, request, *args, **kwargs): self.object = self.get_object() if not self.object.forum.can_read(request.user): raise PermissionDenied if not self.kwargs.get('topic_slug') == slugify(self.object.title): return redirect(self.object.get_absolute_url()) return super(TopicPostsListView, self).get(request, *args, **kwargs)
def test_notification_read(self): """ When we post on a topic, a notification is created for each subscriber. We can read a notification when we display the list of messages of the said topic. """ topic1 = TopicFactory(forum=self.forum11, author=self.user2) PostFactory(topic=topic1, author=self.user2, position=1) result = self.client.post( reverse('post-new') + '?sujet={0}'.format(topic1.pk), { 'last_post': topic1.last_message.pk, 'text': 'C\'est tout simplement l\'histoire de la ville de Paris que je voudrais vous conter ' }, follow=False) self.assertEqual(result.status_code, 302) notification = Notification.objects.get(subscription__user=self.user2) self.assertEqual(notification.is_read, False) self.client.logout() self.assertTrue(self.client.login(username=self.user2.username, password='******'), True) result = self.client.get(reverse('topic-posts-list', args=[topic1.pk, slugify(topic1.title)]), follow=True) self.assertEqual(result.status_code, 200) notification = Notification.objects.get(subscription__user=self.user2) self.assertEqual(notification.is_read, True)
def topic(request, topic_pk, topic_slug): """Display a thread and its posts using a pager.""" # TODO: Clean that up g_topic = get_object_or_404(PrivateTopic, pk=topic_pk) if not g_topic.author == request.user \ and request.user not in list(g_topic.participants.all()): raise PermissionDenied # Check link if not topic_slug == slugify(g_topic.title): return redirect(g_topic.get_absolute_url()) if request.user.is_authenticated(): if never_privateread(g_topic): mark_read(g_topic) posts = PrivatePost.objects.filter(privatetopic__pk=g_topic.pk)\ .order_by('position_in_topic')\ .all() last_post_pk = g_topic.last_message.pk # Handle pagination paginator = Paginator(posts, settings.POSTS_PER_PAGE) try: page_nbr = int(request.GET['page']) except KeyError: page_nbr = 1 try: posts = paginator.page(page_nbr) except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: raise Http404 res = [] if page_nbr != 1: # Show the last post of the previous page last_page = paginator.page(page_nbr - 1).object_list last_post = (last_page)[len(last_page) - 1] res.append(last_post) for post in posts: res.append(post) # Build form to add an answer for the current topid. form = PrivatePostForm(g_topic, request.user) return render_template('mp/topic/index.html', { 'topic': g_topic, 'posts': res, 'pages': paginator_range(page_nbr, paginator.num_pages), 'nb': page_nbr, 'last_post_pk': last_post_pk, 'form': form })
def new_gallery(request): """Creates a new gallery.""" if request.method == "POST": form = GalleryForm(request.POST) if form.is_valid(): data = form.data # Creating the gallery gal = Gallery() gal.title = data["title"] gal.subtitle = data["subtitle"] gal.slug = slugify(data["title"]) gal.pubdate = datetime.now() gal.save() # Attach user userg = UserGallery() userg.gallery = gal userg.mode = "W" userg.user = request.user userg.save() return redirect(gal.get_absolute_url()) else: return render_template("gallery/gallery/new.html", {"form": form}) else: form = GalleryForm() return render_template("gallery/gallery/new.html", {"form": form})
def home(request): """Display the home page with last topics added.""" tutos = [] for tuto in get_last_tutorials(): data = tuto.load_json_for_public() data['pk'] = tuto.pk data['image'] = tuto.image data['gallery'] = tuto.gallery data['pubdate'] = tuto.pubdate data['update'] = tuto.update data['subcategory'] = tuto.subcategory data['get_absolute_url_online'] = reverse( 'zds.tutorial.views.view_tutorial_online', args=[ tuto.pk, slugify( data['title'])]) tutos.append(data) try: with open(os.path.join(SITE_ROOT, 'quotes.txt'), 'r') as fh: quote = random.choice(fh.readlines()) except: quote = u'Zeste de Savoir, la connaissance pour tous et sans pépins !' return render_template('home.html', { 'last_topics': get_last_topics(request.user), 'last_tutorials': tutos, 'last_articles': get_last_articles(), 'quote': quote, })
def get_prod_path(self): if self.chapter.tutorial: chapter_path = os.path.join(os.path.join(settings.REPO_PATH_PROD, self.chapter.tutorial.slug), self.chapter.slug) else: chapter_path = os.path.join(os.path.join(os.path.join(settings.REPO_PATH_PROD, self.chapter.part.tutorial.slug), self.chapter.part.slug), self.chapter.slug) return os.path.join(chapter_path, slugify(self.title)+'.md.html')
def get_absolute_url_beta(self): if self.sha_beta != None: return reverse('zds.tutorial.views.view_tutorial', args=[ self.pk, slugify(self.title) ])+'?version='+self.sha_beta else: return self.get_absolute_url()
def new_gallery(request): ''' Creates a new gallery ''' if request.method == 'POST': form = GalleryForm(request.POST) if form.is_valid(): data = form.data # Creating the gallery gal = Gallery() gal.title = data['title'] gal.subtitle = data['subtitle'] gal.slug = slugify(data['title']) gal.pubdate = datetime.now() gal.save() # Attach user userg = UserGallery() userg.gallery = gal userg.mode = 'W' userg.user = request.user userg.save() return redirect(gal.get_absolute_url()) else: # TODO: add errors to the form and return it raise Http404 else: form = GalleryForm() return render_template('gallery/new_gallery.html', { 'form': form })
def new_image(request, gal_pk): """Creates a new image.""" gal = get_object_or_404(Gallery, pk=gal_pk) # check if the user can upload new image in this gallery try: gal_mode = UserGallery.objects.get(gallery=gal, user=request.user) if gal_mode.mode != 'W': raise PermissionDenied except: raise PermissionDenied if request.method == "POST": form = ImageForm(request.POST, request.FILES) if form.is_valid() and request.FILES["physical"].size < settings.IMAGE_MAX_SIZE: img = Image() img.physical = request.FILES["physical"] img.gallery = gal img.title = request.POST["title"] img.slug = slugify(request.FILES["physical"]) img.legend = request.POST["legend"] img.pubdate = datetime.now() img.save() # Redirect to the newly uploaded image edit page after POST return redirect(reverse("zds.gallery.views.edit_image", args=[gal.pk, img.pk])) else: return render_template("gallery/image/new.html", {"form": form, "gallery": gal}) else: form = ImageForm(initial={"new_image": True}) # A empty, unbound form return render_template("gallery/image/new.html", {"form": form, "gallery": gal})
def topic(request, topic_pk, topic_slug): ''' Display a thread and its posts using a pager ''' # TODO: Clean that up g_topic = get_object_or_404(PrivateTopic, pk=topic_pk) if not g_topic.author == request.user and not request.user in list( g_topic.participants.all()): raise Http404 # Check link if not topic_slug == slugify(g_topic.title): return redirect(g_topic.get_absolute_url()) if request.user.is_authenticated(): if never_privateread(g_topic): mark_read(g_topic) posts = PrivatePost.objects.filter(privatetopic__pk=g_topic.pk)\ .order_by('position_in_topic')\ .all() last_post_pk = g_topic.last_message.pk # Handle pagination paginator = Paginator(posts, settings.POSTS_PER_PAGE) try: page_nbr = int(request.GET['page']) except KeyError: page_nbr = 1 try: posts = paginator.page(page_nbr) except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: raise Http404 res = [] if page_nbr != 1: # Show the last post of the previous page last_page = paginator.page(page_nbr - 1).object_list last_post = (last_page)[len(last_page) - 1] res.append(last_post) for post in posts: res.append(post) return render_template( 'mp/topic.html', { 'topic': g_topic, 'posts': res, 'pages': paginator_range(page_nbr, paginator.num_pages), 'nb': page_nbr, 'last_post_pk': last_post_pk })
def load_dic(self, article_version): article_version['pk'] = self.pk article_version['slug'] = slugify(article_version['title']) article_version['image'] = self.image article_version['pubdate'] = self.pubdate article_version['is_locked'] = self.is_locked article_version['sha_draft'] = self.sha_draft article_version['sha_validation'] = self.sha_validation article_version['sha_public'] = self.sha_public article_version['last_read_reaction'] = self.last_read_reaction article_version['get_reaction_count'] = self.get_reaction_count article_version['get_absolute_url'] = reverse('zds.article.views.view', args=[self.pk, self.slug]) article_version['get_absolute_url_online'] = reverse('zds.article.views.view_online', args=[self.pk, slugify(article_version['title'])]) return article_version
def edit_image(request, gal_pk, img_pk): """Edit an existing image.""" gal = get_object_or_404(Gallery, pk=gal_pk) img = get_object_or_404(Image, pk=img_pk) # Check if user can edit image try: permission = UserGallery.objects.get(user=request.user, gallery=gal) if permission.mode != 'W': raise PermissionDenied except: raise PermissionDenied # Check if the image belong to the gallery if img.gallery != gal: raise PermissionDenied if request.method == "POST": form = UpdateImageForm(request.POST, request.FILES) if form.is_valid(): if "physical" in request.FILES: if request.FILES["physical"].size > settings.IMAGE_MAX_SIZE: messages.error(request, "Votre image est beaucoup trop lourde, réduisez sa taille à moins de {} \ <abbr title=\"kibioctet\">Kio</abbr> avant de l'envoyer".format(str(settings.IMAGE_MAX_SIZE/1024))) else: img.title = request.POST["title"] img.legend = request.POST["legend"] img.physical = request.FILES["physical"] img.slug = slugify(request.FILES["physical"]) img.update = datetime.now() img.save() # Redirect to the newly uploaded image edit page after POST return redirect(reverse("zds.gallery.views.edit_image", args=[gal.pk, img.pk])) else: img.title = request.POST["title"] img.legend = request.POST["legend"] img.update = datetime.now() img.save() # Redirect to the newly uploaded image edit page after POST return redirect(reverse("zds.gallery.views.edit_image", args=[gal.pk, img.pk])) else: form = UpdateImageForm(initial={ "title": img.title, "legend": img.legend, "physical": img.physical, "new_image": False, }) as_avatar_form = ImageAsAvatarForm() return render_template( "gallery/image/edit.html", { "form": form, "as_avatar_form": as_avatar_form, "gallery": gal, "image": img })
def get_absolute_url_beta(self): if self.sha_beta is not None: return ( reverse("zds.tutorial.views.view_tutorial", args=[self.pk, slugify(self.title)]) + "?version=" + self.sha_beta ) else: return self.get_absolute_url()
def view(request, article_pk, article_slug): """Show the given offline article if exists.""" article = get_object_or_404(Article, pk=article_pk) # Only authors of the article and staff can view article in offline. if request.user not in article.authors.all(): if not request.user.has_perm('article.change_article'): raise PermissionDenied # The slug of the article must to be right. if article_slug != slugify(article.title): return redirect(article.get_absolute_url()) # Retrieve sha given by the user. This sha must to be exist. # If it doesn't exist, we take draft version of the article. try: sha = request.GET['version'] except KeyError: sha = article.sha_draft # Find the good manifest file repo = Repo(article.get_path()) # Load the article. try: manifest = get_blob(repo.commit(sha).tree, 'manifest.json') except: sha = article.sha_draft manifest = get_blob(repo.commit(sha).tree, 'manifest.json') article_version = json_reader.loads(manifest) article_version['txt'] = get_blob( repo.commit(sha).tree, article_version['text']) article_version['pk'] = article.pk article_version['slug'] = article.slug article_version['image'] = article.image article_version['pubdate'] = article.pubdate article_version['sha_draft'] = article.sha_draft article_version['sha_validation'] = article.sha_validation article_version['sha_public'] = article.sha_public article_version['get_absolute_url_online'] = article.get_absolute_url_online() validation = Validation.objects.filter(article__pk=article.pk, version=sha)\ .order_by("-date_proposition")\ .first() return render_template('article/member/view.html', { 'article': article_version, 'authors': article.authors, 'tags': article.subcategory, 'version': sha, 'validation': validation })
def edit(request): '''Edit article identified by given GET paramter''' try: article_pk = request.GET['article'] except KeyError: raise Http404 article = get_object_or_404(Article, pk=article_pk) json = article.load_json() # Make sure the user is allowed to do it if not request.user in article.authors.all(): raise Http404 if request.method == 'POST': form = ArticleForm(request.POST, request.FILES) if form.is_valid(): data = form.data old_slug = article.get_path() article.title = data['title'] article.description = data['description'] if 'image' in request.FILES: article.image = request.FILES['image'] article.subcategory.clear() for subcat in form.cleaned_data['subcategory']: article.subcategory.add(subcat) article.save() new_slug = os.path.join(settings.REPO_ARTICLE_PATH, slugify(data['title'])) maj_repo_article(request, old_slug_path=old_slug, new_slug_path=new_slug, article=article, text=data['text'], action='maj') return redirect(article.get_absolute_url()) else: form = ArticleForm({ 'title': json['title'], 'description': json['description'], 'text': article.get_text(), 'subcategory': article.subcategory.all(), }) return render_template('article/edit.html', { 'article': article, 'form': form })
def edit_image(request, gal_pk, img_pk): """Creates a new image.""" gal = get_object_or_404(Gallery, pk=gal_pk) img = get_object_or_404(Image, pk=img_pk) # check if user can edit image try: permission = UserGallery.objects.get(user=request.user, gallery=gal) if permission.mode != 'W': raise PermissionDenied except: raise PermissionDenied # check if the image belong to the gallery if img.gallery != gal: raise PermissionDenied if request.method == "POST": form = ImageForm(request.POST, request.FILES) if form.is_valid(): if "physical" in request.FILES: if request.FILES["physical"].size > settings.IMAGE_MAX_SIZE: messages.error(request, "Votre image est beaucoup trop lourde, réduidez sa taille à moins de {} avant de l'envoyer".format(str(settings.IMAGE_MAX_SIZE/1024*1024))) else: img.title = request.POST["title"] img.legend = request.POST["legend"] img.physical = request.FILES["physical"] img.slug = slugify(request.FILES["physical"]) img.update = datetime.now() img.save() # Redirect to the document list after POST return redirect(gal.get_absolute_url()) else: img.title = request.POST["title"] img.legend = request.POST["legend"] img.update = datetime.now() img.save() # Redirect to the document list after POST return redirect(gal.get_absolute_url()) else: form = ImageForm(initial={"title": img.title, "legend": img.legend, "physical": img.physical}) as_avatar_form = ImageAsAvatarForm() return render_template( "gallery/image/edit.html", { "form": form, "as_avatar_form": as_avatar_form, "gallery": gal, "image": img })
def repo_extract(extract, sha=None): if sha == None: return {'text': extract.get_text()} else: repo_e = Repo(extract['path']) bls_e = repo_e.commit(sha).tree.blobs for bl in bls_e: if bl.path==slugify(extract['title'])+'.md': text = bl.data_stream.read() return {'text': text.decode('utf-8')} return {'text': ''}
def save(self, *args, **kwargs): self.slug = slugify(self.title) if has_changed(self, 'image') and self.image: old = get_old_field_value(self, 'image', 'objects') if old is not None and len(old.name) > 0: root = settings.MEDIA_ROOT name = os.path.join(root, old.name) os.remove(name) super(Article, self).save(*args, **kwargs)
def repo_extract(extract, sha=None): if sha is None: return {'text': extract.get_text()} else: repo_e = Repo(extract['path']) bls_e = repo_e.commit(sha).tree.blobs for bl in bls_e: if bl.path == slugify(extract['title']) + '.md': text = bl.data_stream.read() return {'text': text.decode('utf-8')} return {'text': ''}
def get_prod_path(self): if self.chapter.tutorial: data = self.chapter.tutorial.load_json_for_public() mandata = tutorial.load_dic(data) if "chapter" in mandata: for ext in mandata["chapter"]["extracts"]: if ext['pk'] == self.pk: return os.path.join(settings.REPO_PATH_PROD, str(self.chapter.tutorial.pk) + '_' + slugify(mandata['title']), str(ext['pk']) + "_" + slugify(ext['title'])) \ + '.md.html' else: data = self.chapter.part.tutorial.load_json_for_public() mandata = tutorial.load_dic(data) for part in mandata["parts"]: for chapter in part["chapters"]: for ext in chapter["extracts"]: if ext['pk'] == self.pk: chapter_path = os.path.join(settings.REPO_PATH_PROD, str(mandata['pk']) + '_' + slugify(mandata['title']), str(part['pk']) + "_" + slugify(part['title']), str(chapter['pk']) + "_" + slugify(chapter['title']), str(ext['pk']) + "_" + slugify(ext['title'])) \ + '.md.html'
def edit(request): '''Edit article identified by given GET paramter''' try: article_pk = request.GET['article'] except KeyError: raise Http404 article = get_object_or_404(Article, pk=article_pk) json = article.load_json() # Make sure the user is allowed to do it if not request.user in article.authors.all(): raise Http404 if request.method == 'POST': form = ArticleForm(request.POST, request.FILES) if form.is_valid(): data = form.data old_slug = article.get_path() article.title = data['title'] article.description = data['description'] if 'image' in request.FILES: article.image = request.FILES['image'] article.subcategory.clear() for subcat in form.cleaned_data['subcategory']: article.subcategory.add(subcat) article.save() new_slug = os.path.join(settings.REPO_ARTICLE_PATH, slugify(data['title'])) maj_repo_article(request, old_slug_path=old_slug, new_slug_path=new_slug, article=article, text=data['text'], action = 'maj') return redirect(article.get_absolute_url()) else: form = ArticleForm({ 'title': json['title'], 'description': json['description'], 'text': article.get_text(), 'subcategory': article.subcategory.all(), }) return render_template('article/edit.html', { 'article': article, 'form': form })
def get_path(self, relative=False): if relative: if self.chapter.tutorial: chapter_path = self.chapter.slug else: chapter_path = os.path.join(self.chapter.part.slug, self.chapter.slug) else: if self.chapter.tutorial: chapter_path = os.path.join(os.path.join(settings.REPO_PATH, self.chapter.tutorial.slug), self.chapter.slug) else: chapter_path = os.path.join(os.path.join(os.path.join(settings.REPO_PATH, self.chapter.part.tutorial.slug), self.chapter.part.slug), self.chapter.slug) return os.path.join(chapter_path, slugify(self.title)+'.md')
def get_prod_path(self): if self.chapter.tutorial: chapter_path = os.path.join( os.path.join(settings.REPO_PATH_PROD, self.chapter.tutorial.slug), self.chapter.slug) else: chapter_path = os.path.join( os.path.join( os.path.join(settings.REPO_PATH_PROD, self.chapter.part.tutorial.slug), self.chapter.part.slug), self.chapter.slug) return os.path.join(chapter_path, slugify(self.title) + '.md.html')
def load_dic(self, article_version): article_version['pk'] = self.pk article_version['slug'] = slugify(article_version['title']) article_version['image'] = self.image article_version['pubdate'] = self.pubdate article_version['is_locked'] = self.is_locked article_version['sha_draft'] = self.sha_draft article_version['sha_validation'] = self.sha_validation article_version['sha_public'] = self.sha_public article_version['last_read_reaction'] = self.last_read_reaction article_version[ 'get_reaction_count'] = Reaction.objects.count_reactions(self) article_version['get_absolute_url'] = reverse( 'zds.article.views.view', args=[self.pk, self.slug]) article_version['get_absolute_url_online'] = reverse( 'zds.article.views.view_online', args=[self.pk, slugify(article_version['title'])]) article_version['update'] = self.update article_version['authors'] = self.authors article_version['tags'] = self.subcategory return article_version
def test_url_topic(self): """Test simple get request to the topic.""" user1 = ProfileFactory().user topic1 = TopicFactory(forum=self.forum11, author=self.user) PostFactory(topic=topic1, author=self.user, position=1) PostFactory(topic=topic1, author=user1, position=2) PostFactory(topic=topic1, author=self.user, position=3) # guest can read public topic result = self.client.get(reverse( 'zds.forum.views.topic', args=[topic1.pk, slugify(topic1.title)]), follow=True) self.assertEqual(result.status_code, 200)
class GalleryFactory(factory.DjangoModelFactory): class Meta: model = Gallery title = factory.Sequence('titre de la gallerie {0}'.format) subtitle = factory.Sequence('Sous-titre de la gallerie {0}'.format) slug = factory.LazyAttribute(lambda o: '{0}'.format(slugify(o.title))) @classmethod def _prepare(cls, create, **kwargs): gal = super(GalleryFactory, cls)._prepare(create, **kwargs) with contextlib.suppress(OSError): gal.get_gallery_path().mkdir(parents=True) return gal
def test_get_page_too_far(self): """ get a page that can't exist (like page=42)""" login_check = self.client.login(username=self.profile1.user.username, password='******') self.assertTrue(login_check) response = self.client.get( reverse('zds.mp.views.topic', kwargs={ 'topic_pk': self.topic1.pk, 'topic_slug': slugify(self.topic1.title) }) + '?page=42') self.assertEqual(response.status_code, 404)
def load_dic(self, mandata): mandata["get_absolute_url_online"] = reverse( "zds.tutorial.views.view_tutorial_online", args=[self.pk, slugify(mandata["title"])] ) mandata["get_absolute_url_beta"] = self.get_absolute_url_beta() mandata["get_absolute_url"] = self.get_absolute_url() mandata["get_introduction_online"] = self.get_introduction_online() mandata["get_conclusion_online"] = self.get_conclusion_online() mandata["slug"] = slugify(mandata["title"]) mandata["pk"] = self.pk mandata["on_line"] = self.on_line mandata["authors"] = self.authors mandata["subcategory"] = self.subcategory mandata["image"] = self.image mandata["pubdate"] = self.pubdate mandata["source"] = self.source mandata["have_markdown"] = self.have_markdown() mandata["have_html"] = self.have_html() mandata["have_pdf"] = self.have_pdf() mandata["have_epub"] = self.have_epub() return mandata
def test_fail_topic_slug(self): login_check = self.client.login(username=self.profile1.user.username, password='******') self.assertTrue(login_check) response = self.client.get(reverse('zds.mp.views.topic', args=[self.topic1.pk, 'test']), follow=True) self.assertRedirects( response, reverse('zds.mp.views.topic', args=[self.topic1.pk, slugify(self.topic1.title)]), )
def add_participant(request): ptopic = PrivateTopic.objects.get(pk=request.POST["topic_pk"]) try: part = User.objects.get(username=request.POST["user_pk"]) if part.pk == ptopic.author.pk or part in ptopic.participants.all(): messages.warning(request, "Le membre que vous essayez d'ajouter " u"à la conversation y est déjà") else: ptopic.participants.add(part) ptopic.save() messages.success(request, "Le membre a bien été ajouté à la conversation") except: messages.warning(request, "Le membre que vous avez essayé d'ajouter n'existe pas") return redirect(reverse("zds.mp.views.topic", args=[ptopic.pk, slugify(ptopic.title)]))
def load_tags(cli, size, fake): """ Load tags """ nb_tags = size * 50 cli.stdout.write(u"Nombres de Tags de forum à créer : {}".format(nb_tags)) tps1 = time.time() for i in range(0, nb_tags): title = fake.word() tag = Tag(title=title, slug=slugify(title)) tag.save() sys.stdout.write(" Tag {}/{} \r".format(i + 1, nb_tags)) sys.stdout.flush() tps2 = time.time() cli.stdout.write(u"\nFait en {} sec".format(tps2 - tps1))
def load_dic(self, mandata): mandata['get_absolute_url_online'] = self.get_absolute_url_online() mandata['get_absolute_url'] = self.get_absolute_url() mandata['get_introduction_online'] = self.get_introduction_online() mandata['get_conclusion_online'] = self.get_conclusion_online() mandata['slug'] = slugify(mandata['title']) mandata['pk'] = self.pk mandata['on_line'] = self.on_line mandata['authors'] = self.authors mandata['subcategory'] = self.subcategory mandata['image'] = self.image mandata['pubdate'] = self.pubdate return mandata
def load_dic(self, mandata, sha=None): '''fill mandata with informations from database model''' fns = [ 'is_big', 'is_mini', 'have_markdown','have_html', 'have_pdf', 'have_epub', 'get_path' ] attrs = [ 'pk', 'authors', 'subcategory', 'image', 'pubdate', 'update', 'source', 'sha_draft', 'sha_beta', 'sha_validation', 'sha_public' ] #load functions and attributs in tree for fn in fns: mandata[fn] = getattr(self,fn) for attr in attrs: mandata[attr] = getattr(self,attr) # general information mandata['slug'] = slugify(mandata['title']) mandata['in_beta'] = self.in_beta() and self.sha_beta == sha mandata['in_validation'] = self.in_validation() \ and self.sha_validation == sha mandata['on_line'] = self.on_line() and self.sha_public == sha #url: mandata['get_absolute_url'] = reverse( 'zds.tutorial.views.view_tutorial', args=[self.pk, mandata['slug']] ) if self.in_beta(): mandata['get_absolute_url_beta'] = reverse( 'zds.tutorial.views.view_tutorial', args=[self.pk, mandata['slug']] ) + '?version=' + self.sha_beta else: mandata['get_absolute_url_beta'] = reverse( 'zds.tutorial.views.view_tutorial', args=[self.pk, mandata['slug']] ) mandata['get_absolute_url_online'] = reverse( 'zds.tutorial.views.view_tutorial_online', args=[self.pk, mandata['slug']] )
def load_dic(self, mandata, sha=None): '''fill mandata with informations from database model''' fns = [ 'is_big', 'is_mini', 'have_markdown','have_html', 'have_pdf', 'have_epub', 'get_path', 'in_beta', 'in_validation', 'on_line' ] attrs = [ 'pk', 'authors', 'subcategory', 'image', 'pubdate', 'update', 'source', 'sha_draft', 'sha_beta', 'sha_validation', 'sha_public' ] #load functions and attributs in tree for fn in fns: mandata[fn] = getattr(self,fn) for attr in attrs: mandata[attr] = getattr(self,attr) # general information mandata['slug'] = slugify(mandata['title']) mandata['is_beta'] = self.in_beta() and self.sha_beta == sha mandata['is_validation'] = self.in_validation() \ and self.sha_validation == sha mandata['is_on_line'] = self.on_line() and self.sha_public == sha #url: mandata['get_absolute_url'] = reverse( 'zds.tutorial.views.view_tutorial', args=[self.pk, mandata['slug']] ) if self.in_beta(): mandata['get_absolute_url_beta'] = reverse( 'zds.tutorial.views.view_tutorial', args=[self.pk, mandata['slug']] ) + '?version=' + self.sha_beta else: mandata['get_absolute_url_beta'] = reverse( 'zds.tutorial.views.view_tutorial', args=[self.pk, mandata['slug']] ) mandata['get_absolute_url_online'] = reverse( 'zds.tutorial.views.view_tutorial_online', args=[self.pk, mandata['slug']] )
def form_valid(self, form): gallery = Gallery() gallery.title = form.cleaned_data['title'] gallery.subtitle = form.cleaned_data['subtitle'] gallery.slug = slugify(form.cleaned_data['title']) gallery.pubdate = datetime.now() gallery.save() # Attach user : userg = UserGallery() userg.gallery = gallery userg.mode = 'W' userg.user = self.request.user userg.save() return HttpResponseRedirect(gallery.get_absolute_url())
def test_url_topic(self): """Test simple get request to the topic.""" user1 = ProfileFactory().user topic1 = TopicFactory(forum=self.forum11, author=self.user) PostFactory(topic=topic1, author=self.user, position=1) PostFactory(topic=topic1, author=user1, position=2) PostFactory(topic=topic1, author=self.user, position=3) # guest can read public topic result = self.client.get( reverse( 'zds.forum.views.topic', args=[ topic1.pk, slugify(topic1.title)]), follow=True) self.assertEqual(result.status_code, 200)
class ImageFactory(factory.DjangoModelFactory): class Meta: model = Image title = factory.Sequence(u"titre de l\'image {0}".format) slug = factory.LazyAttribute(lambda o: "{0}".format(slugify(o.title))) legend = factory.Sequence(u"legende de l'image {0}".format) physical = factory.django.ImageField(color='blue') @classmethod def _prepare(cls, create, **kwargs): gallery = kwargs.pop('gallery', None) if gallery is not None: image = super(ImageFactory, cls)._prepare(create, gallery=gallery, **kwargs) else: image = None return image
def test_view_mp(self): """check mp is readable.""" ptopic1 = PrivateTopicFactory(author=self.user1) PrivatePostFactory(privatetopic=ptopic1, author=self.user1, position_in_topic=1) PrivatePostFactory(privatetopic=ptopic1, author=self.staff, position_in_topic=2) PrivatePostFactory(privatetopic=ptopic1, author=self.user1, position_in_topic=3) result = self.client.get(reverse( 'zds.mp.views.topic', args=[ptopic1.pk, slugify(ptopic1.title)]), follow=True) self.assertEqual(result.status_code, 200)
def get_path(self, relative=False): if relative: if self.chapter.tutorial: chapter_path = '' else: chapter_path = os.path.join( self.chapter.part.get_phy_slug(), self.chapter.get_phy_slug()) else: if self.chapter.tutorial: chapter_path = os.path.join(settings.REPO_PATH, self.chapter.tutorial.get_phy_slug()) else: chapter_path = os.path.join(settings.REPO_PATH, self.chapter.part.tutorial.get_phy_slug(), self.chapter.part.get_phy_slug(), self.chapter.get_phy_slug()) return os.path.join(chapter_path, str(self.pk) + "_" + slugify(self.title)) + '.md'
def load_dic(self, mandata): mandata['get_absolute_url_online'] = self.get_absolute_url_online() mandata['get_absolute_url'] = self.get_absolute_url() mandata['get_introduction_online'] = self.get_introduction_online() mandata['get_conclusion_online'] = self.get_conclusion_online() mandata['slug'] = slugify(mandata['title']) mandata['pk'] = self.pk mandata['on_line'] = self.on_line mandata['authors'] = self.authors mandata['subcategory'] = self.subcategory mandata['image'] = self.image mandata['pubdate'] = self.pubdate mandata['source'] = self.source mandata['have_markdown'] = self.have_markdown() mandata['have_html'] = self.have_html() mandata['have_pdf'] = self.have_pdf() mandata['have_epub'] = self.have_epub() return mandata
def history(request, article_pk, article_slug): """Display an article.""" article = get_object_or_404(Article, pk=article_pk) if not article.on_line() \ and not request.user.has_perm('article.change_article') \ and request.user not in article.authors.all(): raise Http404 # Make sure the URL is well-formed if not article_slug == slugify(article.title): return redirect(article.get_absolute_url()) repo = Repo(article.get_path()) logs = repo.head.reference.log() logs = sorted(logs, key=attrgetter('time'), reverse=True) return render_template('article/member/history.html', { 'article': article, 'logs': logs })
def create_gallery_for_article(content): # Creating the gallery gal = Gallery() gal.title = content.title gal.slug = slugify(content.title) gal.pubdate = datetime.now() gal.save() # Attach user to gallery for user in content.authors.all(): userg = UserGallery() userg.gallery = gal userg.mode = "W" # write mode userg.user = user userg.save() content.gallery = gal if not os.path.exists(gal.get_gallery_path()): os.makedirs(gal.get_gallery_path()) return gal
def get_path(self, relative=False): if relative: if self.chapter.tutorial: chapter_path = self.chapter.slug else: chapter_path = os.path.join(self.chapter.part.slug, self.chapter.slug) else: if self.chapter.tutorial: chapter_path = os.path.join( os.path.join(settings.REPO_PATH, self.chapter.tutorial.slug), self.chapter.slug) else: chapter_path = os.path.join( os.path.join( os.path.join(settings.REPO_PATH, self.chapter.part.tutorial.slug), self.chapter.part.slug), self.chapter.slug) return os.path.join(chapter_path, slugify(self.title) + '.md')
def test_more_than_one_message(self): """ test get second page """ login_check = self.client.login(username=self.profile1.user.username, password='******') self.assertTrue(login_check) # create many subjects (at least two pages) for i in range(1, settings.ZDS_APP['forum']['topics_per_page'] + 5): post = PrivatePostFactory(privatetopic=self.topic1, author=self.profile1.user, position_in_topic=i + 2) response = self.client.get( reverse('zds.mp.views.topic', kwargs={ 'topic_pk': self.topic1.pk, 'topic_slug': slugify(self.topic1.title) }) + '?page=2') self.assertEqual(response.status_code, 200) self.assertEqual(response.context['posts'][-1], post) self.assertEqual(response.context['last_post_pk'], post.pk)
def new_image(request, gal_pk): """Creates a new image.""" gal = get_object_or_404(Gallery, pk=gal_pk) # check if the user can upload new image in this gallery try: gal_mode = UserGallery.objects.get(gallery=gal, user=request.user) if gal_mode.mode != 'W': raise PermissionDenied except: raise PermissionDenied if request.method == "POST": form = ImageForm(request.POST, request.FILES) if form.is_valid(): img = Image() img.physical = request.FILES["physical"] img.gallery = gal img.title = request.POST["title"] img.slug = slugify(request.FILES["physical"]) img.legend = request.POST["legend"] img.pubdate = datetime.now() img.save() # Redirect to the newly uploaded image edit page after POST return redirect( reverse("zds.gallery.views.edit_image", args=[gal.pk, img.pk])) else: return render_template("gallery/image/new.html", { "form": form, "gallery": gal }) else: form = ImageForm(initial={"new_image": True}) # A empty, unbound form return render_template("gallery/image/new.html", { "form": form, "gallery": gal })
def view(request, article_pk, article_slug): '''Show the given article if exists and is visible''' article = get_object_or_404(Article, pk=article_pk) if article.authors.filter(pk=request.user.pk).count() == 0: raise Http404 try: sha = request.GET['version'] except KeyError: sha = article.sha_draft if article_slug != slugify(article.title): return redirect(article.get_absolute_url()) #find the good manifest file repo = Repo(article.get_path()) manifest = get_blob(repo.commit(sha).tree, 'manifest.json') article_version = json.loads(manifest) article_version['txt'] = get_blob( repo.commit(sha).tree, article_version['text']) article_version['pk'] = article.pk article_version['slug'] = article.slug article_version['sha_validation'] = article.sha_validation article_version['sha_public'] = article.sha_public validation = Validation.objects.filter(article__pk=article.pk, version=sha) return render_template( 'article/view.html', { 'article': article_version, 'authors': article.authors, 'tags': article.subcategory, 'version': sha, 'prev': get_prev_article(article), 'next': get_next_article(article), 'validation': validation })
def add_participant(request): ptopic = PrivateTopic.objects.get(pk=request.POST['topic_pk']) try: part = User.objects.get(username=request.POST['user_pk']) if part.pk == ptopic.author.pk or part in ptopic.participants.all(): messages.warning( request, 'Le membre que vous essayez d\'ajouter ' u'à la conversation y est déjà') else: ptopic.participants.add(part) ptopic.save() messages.success( request, 'Le membre a bien été ajouté à la conversation') except: messages.warning( request, 'Le membre que vous avez essayé d\'ajouter n\'existe pas') return redirect(reverse('zds.mp.views.topic', args=[ ptopic.pk, slugify(ptopic.title)]))
def view(request, article_pk, article_slug): '''Show the given article if exists and is visible''' article = get_object_or_404(Article, pk=article_pk) if article.authors.filter(pk = request.user.pk).count()==0: raise Http404 try: sha = request.GET['version'] except KeyError: sha = article.sha_draft if article_slug != slugify(article.title): return redirect(article.get_absolute_url()) #find the good manifest file repo = Repo(article.get_path()) manifest = get_blob(repo.commit(sha).tree, 'manifest.json') article_version = json.loads(manifest) article_version['txt'] = get_blob(repo.commit(sha).tree, article_version['text']) article_version['pk'] = article.pk article_version['slug'] = article.slug article_version['sha_validation'] = article.sha_validation article_version['sha_public'] = article.sha_public validation = Validation.objects.filter(article__pk=article.pk, version = sha) return render_template('article/view.html', { 'article': article_version, 'authors': article.authors, 'tags': article.subcategory, 'version': sha, 'prev': get_prev_article(article), 'next': get_next_article(article), 'validation': validation })
def test_notification_read(self): """ When we post on a topic, a notification is created for each subscriber. We can read a notification when we display the list of messages of the said topic. """ topic1 = TopicFactory(forum=self.forum11, author=self.user2) PostFactory(topic=topic1, author=self.user2, position=1) result = self.client.post(reverse('post-new') + '?sujet={0}'.format( topic1.pk ), { 'last_post': topic1.last_message.pk, 'text': 'C\'est tout simplement l\'histoire de la ville de Paris que je voudrais vous conter ' }, follow=False) self.assertEqual(result.status_code, 302) notification = Notification.objects.get(subscription__user=self.user2) self.assertEqual(notification.is_read, False) self.client.logout() self.assertTrue( self.client.login(username=self.user2.username, password='******'), True) result = self.client.get(reverse( 'topic-posts-list', args=[topic1.pk, slugify(topic1.title)]), follow=True) self.assertEqual(result.status_code, 200) notification = Notification.objects.get(subscription__user=self.user2) self.assertEqual(notification.is_read, True)