Example #1
0
    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]))
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
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
        })
Example #5
0
 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)
Example #6
0
 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)
Example #7
0
    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)
Example #8
0
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
    })
Example #9
0
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})
Example #10
0
 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)
Example #11
0
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,
    })
Example #12
0
 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') 
Example #13
0
 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()
Example #14
0
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
        })
Example #15
0
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})
Example #16
0
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
        })
Example #17
0
 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
Example #18
0
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
        })
Example #19
0
 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()
Example #20
0
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
    })
Example #21
0
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
    })
Example #22
0
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
        })
Example #23
0
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': ''}
Example #24
0
    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)
Example #25
0
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': ''}
Example #26
0
    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)
Example #27
0
    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'
Example #28
0
 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'
Example #29
0
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
    })
Example #30
0
 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') 
Example #31
0
    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')
Example #32
0
    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
Example #33
0
    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)
Example #34
0
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
Example #35
0
    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)
Example #36
0
    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
Example #37
0
    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)]),
        )
Example #38
0
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)]))
Example #39
0
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))
Example #40
0
    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
Example #41
0
    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']]
            )
Example #42
0
    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']]
            )
Example #43
0
    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())
Example #44
0
    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)
Example #45
0
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
Example #46
0
    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)
Example #47
0
    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'
Example #48
0
    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'
Example #49
0
    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
Example #50
0
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
    })
Example #51
0
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
    })
Example #52
0
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
Example #53
0
    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')
Example #54
0
    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)
Example #55
0
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
        })
Example #56
0
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
        })
Example #57
0
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)]))
Example #58
0
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
    })
Example #59
0
    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)