internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: zestedesavoir/zds-site

Issue:
Un membre devrait pouvoir signaler un message caché
https://zestedesavoir.com/forums/sujet/11117/ne-plus-utiliser-anonyme/?page=4#p195842

Une personne avec les permissions staffs peut signaler un message caché alors qu'un membre ne peut pas.

Il faudrait changer la condition de ce bouton dans le template.


Discussion:
À noter qu'il y a déjà eu pas mal de modifications sur ce point, cf notamment #4379, #4537, #3759 et #3649. Je pense que le problème vient surtout du fait que l'on a jamais vraiment défini si le signalement d'un message masqué était souhaitable ou non. ^^
Ah #4537 (2017) le masque volontairement pour les membres, alors qu'en 2016 (#3759) semble maitre le bouton volontairement.

@artragis tu as le même avis que sur #4537, cad laisser comme actuellement ? ou permettre au membre de signaler ?

Faut-il avoir le même comportement sur un sujet et un message ?

Perso je m'en fiche totalement. Comme c'est actuellement me va mais certains aimeraient qu'on revienne au comportement initial. 

Je garde l'issue car elle fait une bonne première issue mais c'est loin d'être prioritaire. D'ailleur j'aimerais vraiment que vous laissiez cette tâche aux nouveaux contributeurs.

Resolving patch:
diff --git a/zds/forum/views.py b/zds/forum/views.py
--- a/zds/forum/views.py
+++ b/zds/forum/views.py
@@ -611,9 +611,7 @@ def dispatch(self, request, *args, **kwargs):
         with transaction.atomic():
             self.object = self.get_object()
             can_read = self.object.topic.forum.can_read(request.user)
-            is_visible = self.object.is_visible
-            can_edit = request.user.has_perm('forum.change_post')
-            if can_read and (is_visible or can_edit):
+            if can_read:
                 return super(PostSignal, self).dispatch(request, *args, **kwargs)
         raise PermissionDenied
 


Test patch:
diff --git a/zds/forum/tests/tests_views.py b/zds/forum/tests/tests_views.py
--- a/zds/forum/tests/tests_views.py
+++ b/zds/forum/tests/tests_views.py
@@ -1756,7 +1756,7 @@ def test_alert(self):
         self.client.login(username=profile.user.username, password='hostel77')
         response = self.client.get(reverse('topic-posts-list', args=[topic.pk, topic.slug()]))
         alerts = [word for word in str(response.content).split() if word == 'alert']
-        self.assertEqual(len(alerts), 1)
+        self.assertEqual(len(alerts), 2)
 
     def test_hide(self):
         profile = ProfileFactory()
Repository: zestedesavoir/zds-site

Issue:
[v29.1] Le temps de lecture ne fonctionne pas sur les gros contenus
Sur les gros contenus, le temps de lecture affiché est "moins d'une minute" au lieu du temps calculé.

Si ma mémooire est bonne, la solution trouvée avec artragis, firm1 et TAlone sur Discord est de modifier la fonction `render_markdown_stats` du fichier `zds/utils/templatetags/emarkdown.py` pour qu'elle communique avec zmarkdown sur l'*endpoint* `tex` et non pas `html` (celui par défaut).


Discussion:

Resolving patch:
diff --git a/zds/tutorialv2/management/commands/adjust_char_count.py b/zds/tutorialv2/management/commands/adjust_char_count.py
--- a/zds/tutorialv2/management/commands/adjust_char_count.py
+++ b/zds/tutorialv2/management/commands/adjust_char_count.py
@@ -1,5 +1,3 @@
-import logging
-
 from django.core.management.base import BaseCommand
 
 from zds.tutorialv2.models.database import PublishedContent
@@ -25,7 +23,7 @@ def handle(self, *args, **options):
             query = PublishedContent.objects.filter(must_redirect=False)
 
         for content in query:
-            logging.error('ids = ' + str(content))
+            self.stdout.write('Processing « {} »...'.format(content.title()))
             content.char_count = content.get_char_count()
             content.save()
-            logging.info('content %s got %d letters', content.title(), content.char_count)
+            self.stdout.write('  It got {} letters.'.format(content.char_count))
diff --git a/zds/utils/templatetags/emarkdown.py b/zds/utils/templatetags/emarkdown.py
--- a/zds/utils/templatetags/emarkdown.py
+++ b/zds/utils/templatetags/emarkdown.py
@@ -123,7 +123,9 @@ def render_markdown_stats(md_input, **kwargs):
     Returns contents statistics (words and chars)
     """
     kwargs['stats'] = True
-    content, metadata, messages = _render_markdown_once(md_input, **kwargs)
+    kwargs['disable_images_download'] = True
+    logger.setLevel(logging.INFO)
+    content, metadata, messages = _render_markdown_once(md_input, output_format='tex', **kwargs)
     if metadata:
         return metadata.get('stats', {}).get('signs', {})
     return None


Test patch:
Repository: zestedesavoir/zds-site

Issue:
La publication d'un billet sans licence est sans issue
**Description du bug**

Sur un billet crée sans licence, lorsqu'on essaye de le publier, le lien proposé dans la modale ne renvoi vers rien.

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Allez sur le site en local
2. Connectez vous avec le compte admin
3. Créez un billet (en ne renseignant que son titre)
4. Essayez de publier ce billet (en cliquant dans la sidebar `Actions > Publier`)

La modale suivante s'affiche :

![Capture d’écran de 2020-06-10 10-01-53](https://user-images.githubusercontent.com/6066015/84242993-df6cfc00-ab01-11ea-9be3-2213573233cc.png)

5. cliquez ensuite sur le lien "choisir une licence"
6. constatez que ça ne renvoi vers rien.

**Comportement attendu**

Le comportement attendu ici est qu'en cliquant sur le lien "choisir une licence", qu'on soit redirigé vers une boite de dialogue (comme celle-ci dessous que l'on a pour la demande de validation d'un article sans licence)

![Capture d’écran de 2020-06-10 10-07-17](https://user-images.githubusercontent.com/6066015/84243243-307cf000-ab02-11ea-948b-14636d03416c.png)


**Informations techniques**

- OS: `Linux`
- Navigateur: `Chromium 81`
- Version/environnement de zds:  `branche de dev`



Discussion:

Resolving patch:
diff --git a/zds/tutorialv2/forms.py b/zds/tutorialv2/forms.py
--- a/zds/tutorialv2/forms.py
+++ b/zds/tutorialv2/forms.py
@@ -1197,15 +1197,14 @@ def __init__(self, content, *args, **kwargs):
         self.no_subcategories = content.subcategory.count() == 0
         no_category_msg = HTML(_("""<p><strong>Votre publication n'est dans aucune catégorie.
                                     Vous devez <a href="{}#{}">choisir une catégorie</a>
-                                    avant de demander la validation.</strong></p>"""
+                                    avant de publier.</strong></p>"""
                                  .format(reverse('content:edit', kwargs={'pk': content.pk, 'slug': content.slug}),
                                          'div_id_subcategory')))
 
         self.no_license = not content.licence
         no_license_msg = HTML(_("""<p><strong>Vous n'avez pas choisi de licence pour votre publication.
-                                   Vous devez <a href="{}">choisir une licence</a>
-                                   avant de demander la validation.</strong></p>"""
-                                .format('#edit-license')))
+                                   Vous devez <a href="#edit-license" class="open-modal">choisir une licence</a>
+                                   avant de publier.</strong></p>"""))
 
         self.helper.layout = Layout(
             no_category_msg if self.no_subcategories else None,


Test patch:
Repository: zestedesavoir/zds-site

Issue:
L'éditeur moderne n'est pas chargé sur l'édition de profile
**Description du bug**

Lorsqu'on essaye de modifier sa biographie en ayant activé l'éditeur moderne (easymde), l'éditeur n'est pas chargé.

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Allez sur le site en local
2. Connectez vous avec le compte 'admin'
3. Allez sur la page de modification de votre profil : http://localhost:8000/membres/parametres/profil/
4. Assurez vous que vous avez activé l'éditeur moderne et constatez que vous n'avez pas les boutons de l'éditeur moderne.

Dans la console JS du navigateur on a le message d'erreur 

```
editor-new.js:376 Uncaught ReferenceError: EasyMDE is not defined
    at HTMLTextAreaElement.<anonymous> (editor-new.js:376)
    at Function.each (jquery.min.js:2)
    at S.fn.init.each (jquery.min.js:2)
    at editor-new.js:337
    at editor-new.js:757
```

**Comportement attendu**

On s'attend à ce que les boutons de l'éditeurs moderne soit présents comme c'est le cas en production actuellement.

**Capture d'écran**

Voici ce que l'on a qui montre le bug.

![Capture d’écran de 2020-06-23 11-29-36](https://user-images.githubusercontent.com/6066015/85387284-e9045400-b544-11ea-943e-ce467b42e55f.png)

En production on a quelque chose qui fonctionne comme attendu.

![Capture d’écran de 2020-06-23 11-29-59](https://user-images.githubusercontent.com/6066015/85387500-3254a380-b545-11ea-8e78-9a74c7ba35bc.png)


**Informations techniques**

- OS: Linux
- Navigateur: Brave (Chromium)
- Version/environnement de zds: branche dev.



Discussion:

Resolving patch:
diff --git a/zds/member/forms.py b/zds/member/forms.py
--- a/zds/member/forms.py
+++ b/zds/member/forms.py
@@ -281,6 +281,7 @@ def __init__(self, *args, **kwargs):
             self.fields['options'].initial += 'email_for_new_mp'
 
         layout = Layout(
+            IncludeEasyMDE(),
             Field('biography'),
             ButtonHolder(StrictButton(_('Aperçu'), type='preview', name='preview',
                                       css_class='btn btn-grey preview-btn'),),


Test patch:
Repository: zestedesavoir/zds-site

Issue:
La limite de caractères pour le message de modification d’un contenu est trop faible
**Description du bug**

voir titre. Cela signifie que l'on ne peut pas être très précis dans le message pour ne pas dépasser cette limite. La limite semble être de 80 caractères.

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Créer un tutoriel
2. éditer une partie
3. écrire le message de modification (en dessous de la zone de rédaction)
4. Remarquer que la limite est faible.

**Comportement attendu**

Une limite plus élevée (≥200 au moins).


Discussion:
Ce problème est assez simple à corriger (je le marque donc comme facile).

Le nombre de caractères est limité par les deux formulaires acceptant un message de commit : [`ContainerForm`](https://github.com/zestedesavoir/zds-site/blob/d7c18e8d7e4df734f2b53e9e23270b7dbfe4be70/zds/tutorialv2/forms.py#L205-L214), qui est le formulaire parent de tous ceux qui ont une introduction et une conclusion ; et [`ExtractForm`](https://github.com/zestedesavoir/zds-site/blob/d7c18e8d7e4df734f2b53e9e23270b7dbfe4be70/zds/tutorialv2/forms.py#L433-L442), qui est celui de ceux permettant la modification d'une section.

#### `ContainerForm`

https://github.com/zestedesavoir/zds-site/blob/d7c18e8d7e4df734f2b53e9e23270b7dbfe4be70/zds/tutorialv2/forms.py#L182-L214

#### `ExtractForm`

https://github.com/zestedesavoir/zds-site/blob/d7c18e8d7e4df734f2b53e9e23270b7dbfe4be70/zds/tutorialv2/forms.py#L421-L442

Il faut modifier, dans ces deux formulaires, le nombre maximal de caractères autorisé pour le message de commit, par une valeur jugée pertinente. Il n'y a normalement rien d'autre à faire (si ce n'est potentiellement mettre à jour les tests si cette limite est testée), car l'implémentation sous-jacente effectuant le commit n'a pas de limite de taille (un texte de commit pouvant être très long, `git` n'en a cure).

Resolving patch:
diff --git a/zds/tutorialv2/forms.py b/zds/tutorialv2/forms.py
--- a/zds/tutorialv2/forms.py
+++ b/zds/tutorialv2/forms.py
@@ -204,7 +204,7 @@ class ContainerForm(FormWithTitle):
 
     msg_commit = forms.CharField(
         label=_('Message de suivi'),
-        max_length=80,
+        max_length=400,
         required=False,
         widget=forms.TextInput(
             attrs={
@@ -432,7 +432,7 @@ class ExtractForm(FormWithTitle):
 
     msg_commit = forms.CharField(
         label=_('Message de suivi'),
-        max_length=80,
+        max_length=400,
         required=False,
         widget=forms.TextInput(
             attrs={
@@ -514,7 +514,7 @@ class ImportContentForm(forms.Form):
 
     msg_commit = forms.CharField(
         label=_('Message de suivi'),
-        max_length=80,
+        max_length=400,
         required=False,
         widget=forms.TextInput(
             attrs={


Test patch:
Repository: zestedesavoir/zds-site

Issue:
Un simple membre ne peut pas ajouter une raison au masquage
Lorsqu'on est un simple membre, on n'a pas la possibilité d'ajouter une raison au masquage d'un message sur le forum (pour justifier => HS / déjà répondu / a côté de la plaque) alors qu'un staff peut ajouter un commentaire sur la raison du masquage.
Un simple membre ne peut pas ajouter une raison au masquage
Lorsqu'on est un simple membre, on n'a pas la possibilité d'ajouter une raison au masquage d'un message sur le forum (pour justifier => HS / déjà répondu / a côté de la plaque) alors qu'un staff peut ajouter un commentaire sur la raison du masquage.


Discussion:

Resolving patch:
diff --git a/zds/forum/commons.py b/zds/forum/commons.py
--- a/zds/forum/commons.py
+++ b/zds/forum/commons.py
@@ -104,9 +104,7 @@ def perform_hide_message(request, post, user, data):
                 alert.solve(user, _('Le message a été masqué.'))
             post.is_visible = False
             post.editor = user
-
-            if is_staff:
-                post.text_hidden = data.get('text_hidden', '')
+            post.text_hidden = data.get('text_hidden', '')
 
             messages.success(request, _('Le message est désormais masqué.'))
             for user in Notification.objects.get_users_for_unread_notification_on(post):


Test patch:
Repository: zestedesavoir/zds-site

Issue:
La demande d'aide sur un contenu ne déclenche rien
**Description du bug**

Cliquez sur un type d'aide dans la sidebar ne semble pas déclencher de demande d'aide.

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Allez sur le site '...'
2. Connectez vous avec le compte '....'
3. Allez le brouillon d'un contenu (dans mon cas c'était le brouillon d'un contenu déjà publié)
4. Cliquez sur "Repreneur" dans la sidebar et contatez qu'un bref bouton check s'affiche à gauche du texte, puis disparait sans aucune forme de message.

**Comportement attendu**

J'aimerai que le clic sur ce bouton m'informe à minima que ma demande a été prise en compte et que je retrouve mon contenu dans la liste des contenus qui ont besoin d'une aide.

**Capture d'écran**

![Capture d’écran de 2020-07-17 13-36-01](https://user-images.githubusercontent.com/6066015/87782253-7aa86e00-c832-11ea-9719-ba76c075c38e.png)


**Informations techniques**

- OS: Linux
- Navigateur: Brave (Chromium)
- Version/environnement de zds: beta

La demande d'aide sur un contenu ne déclenche rien
**Description du bug**

Cliquez sur un type d'aide dans la sidebar ne semble pas déclencher de demande d'aide.

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Allez sur le site '...'
2. Connectez vous avec le compte '....'
3. Allez le brouillon d'un contenu (dans mon cas c'était le brouillon d'un contenu déjà publié)
4. Cliquez sur "Repreneur" dans la sidebar et contatez qu'un bref bouton check s'affiche à gauche du texte, puis disparait sans aucune forme de message.

**Comportement attendu**

J'aimerai que le clic sur ce bouton m'informe à minima que ma demande a été prise en compte et que je retrouve mon contenu dans la liste des contenus qui ont besoin d'une aide.

**Capture d'écran**

![Capture d’écran de 2020-07-17 13-36-01](https://user-images.githubusercontent.com/6066015/87782253-7aa86e00-c832-11ea-9719-ba76c075c38e.png)


**Informations techniques**

- OS: Linux
- Navigateur: Brave (Chromium)
- Version/environnement de zds: beta



Discussion:

Resolving patch:
diff --git a/zds/tutorialv2/urls/urls_contents.py b/zds/tutorialv2/urls/urls_contents.py
--- a/zds/tutorialv2/urls/urls_contents.py
+++ b/zds/tutorialv2/urls/urls_contents.py
@@ -40,7 +40,7 @@
     path('tribunes/<int:pk>/', RedirectOldContentOfAuthor.as_view(type='OPINION')),
 
     re_path(r'^aides/$', ContentsWithHelps.as_view(), name='helps'),
-    re_path(r'^aides/(?P<pk>\d+)/change$', ChangeHelp.as_view(), name='helps-change'),
+    re_path(r'^aides/(?P<pk>\d+)/change/$', ChangeHelp.as_view(), name='helps-change'),
     re_path(r'^(?P<pk>\d+)/(?P<slug>.+)/(?P<parent_container_slug>.+)/(?P<container_slug>.+)/$',
             DisplayContainer.as_view(public_is_prioritary=False),
             name='view-container'),


Test patch:
Repository: zestedesavoir/zds-site

Issue:
[v29.2] La liste des besoins n'est pas présente lors de la consultation d'un contenu en beta
**Description du bug**

Lorsqu'on consulte la beta d'un contenu qui cherche de l'aide, la liste des besoins n'est pas affichée dans la zone d'alerte verte.

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Allez sur le site en beta
2. Connectez vous avec le compte '....'
3. Cliquez sur le lien suivant [creer-un-jeu-html5-avec-quintus](https://beta.zestedesavoir.com/contenus/beta/599/creer-un-jeu-html5-avec-quintus/)
4. Constatez la boite d'alerte verte qui dit "L’auteur de ce contenu recherche N’hésitez pas à le contacter par MP pour proposer votre aide !"

**Comportement attendu**

Le comportement attendu pour notre lien est quelque chose comme "L’auteur de ce contenu recherche **un illustrateur**. N’hésitez pas à le contacter par MP pour proposer votre aide ! "

**Capture d'écran**

![image](https://user-images.githubusercontent.com/6066015/88067224-0261e580-cb6f-11ea-847e-d383acd94be6.png)

ou encore (pour un article dont je suis l'auteur)

![image](https://user-images.githubusercontent.com/6066015/88067279-16a5e280-cb6f-11ea-840d-fee6ea9acf9b.png)

**Informations techniques**

- OS: Windows
- Navigateur: Firefox 68
- Version/environnement de zds: beta



Discussion:

Resolving patch:
diff --git a/zds/tutorialv2/mixins.py b/zds/tutorialv2/mixins.py
--- a/zds/tutorialv2/mixins.py
+++ b/zds/tutorialv2/mixins.py
@@ -261,7 +261,7 @@ def get(self, request, *args, **kwargs):
     def get_context_data(self, **kwargs):
         context = super(SingleContentDetailViewMixin, self).get_context_data(**kwargs)
         context['helps'] = list(HelpWriting.objects.all())
-        context['content_helps'] = self.object.helps.values_list('pk', flat=True)
+        context['content_helps'] = list(self.object.helps.all())
         context['content'] = self.versioned_object
         context['can_edit'] = self.is_author
         context['is_staff'] = self.is_staff
diff --git a/zds/tutorialv2/views/contents.py b/zds/tutorialv2/views/contents.py
--- a/zds/tutorialv2/views/contents.py
+++ b/zds/tutorialv2/views/contents.py
@@ -249,7 +249,6 @@ def get_object(self, queryset=None):
 
     def get_context_data(self, **kwargs):
         context = super(DisplayBetaContent, self).get_context_data(**kwargs)
-        context['helps'] = list(self.object.helps.all())
         context['pm_link'] = self.object.get_absolute_contact_url()
         return context
 
@@ -1136,7 +1135,6 @@ def get_object(self, queryset=None):
 
     def get_context_data(self, **kwargs):
         context = super(DisplayBetaContainer, self).get_context_data(**kwargs)
-        context['helps'] = list(self.object.helps.all())
         context['pm_link'] = self.object.get_absolute_contact_url()
         return context
 


Test patch:
Repository: zestedesavoir/zds-site

Issue:
Supprimer les messages privés de l'interface d'administration de Django
À l'heure actuelle, un super-admin peut, via l'interface de Django, lire tous les MPs du site. Certes, l'interface est peu pratique pour ça (aucune notion de fil, etc.), mais je trouve tout de même bien peu souhaitable.

![Regardez-moi tous ces MPs dans l'interface d'administration de Django.](https://user-images.githubusercontent.com/1417570/88059844-b199bf00-cb65-11ea-8dc9-fc78310001c7.png)

Après discussion avec @gcodeur sur ce sujet, je propose donc de **supprimer les MPs de l'interface d'administration de Django**. Une personne avec les accès prod pourrait toujours les lire (vu qu'ils ne sont pas chiffrés de bout en bout), mais ça limiterait d'autant l'exposition.
Supprimer les messages privés de l'interface d'administration de Django
À l'heure actuelle, un super-admin peut, via l'interface de Django, lire tous les MPs du site. Certes, l'interface est peu pratique pour ça (aucune notion de fil, etc.), mais je trouve tout de même bien peu souhaitable.

![Regardez-moi tous ces MPs dans l'interface d'administration de Django.](https://user-images.githubusercontent.com/1417570/88059844-b199bf00-cb65-11ea-8dc9-fc78310001c7.png)

Après discussion avec @gcodeur sur ce sujet, je propose donc de **supprimer les MPs de l'interface d'administration de Django**. Une personne avec les accès prod pourrait toujours les lire (vu qu'ils ne sont pas chiffrés de bout en bout), mais ça limiterait d'autant l'exposition.


Discussion:

Resolving patch:
diff --git a/zds/mp/admin.py b/zds/mp/admin.py
deleted file mode 100644
--- a/zds/mp/admin.py
+++ /dev/null
@@ -1,32 +0,0 @@
-from django.contrib import admin
-
-from .models import PrivatePost, PrivateTopic, PrivateTopicRead
-
-
-class PrivatePostAdmin(admin.ModelAdmin):
-
-    """Representation of PrivatePost model in the admin interface."""
-
-    list_display = ('privatetopic', 'author', 'pubdate', 'update', 'position_in_topic')
-    raw_id_fields = ('privatetopic', 'author')
-
-
-class PrivateTopicAdmin(admin.ModelAdmin):
-
-    """Representation of PrivateTopic model in the admin interface."""
-
-    list_display = ('title', 'subtitle', 'author', 'last_message', 'pubdate')
-    raw_id_fields = ('author', 'participants', 'last_message')
-
-
-class PrivateTopicReadAdmin(admin.ModelAdmin):
-
-    """Representation of PrivateTopicRead model in the admin interface."""
-
-    list_display = ('privatetopic', 'privatepost', 'user')
-    raw_id_fields = ('privatetopic', 'privatepost', 'user')
-
-
-admin.site.register(PrivatePost, PrivatePostAdmin)
-admin.site.register(PrivateTopic, PrivateTopicAdmin)
-admin.site.register(PrivateTopicRead, PrivateTopicReadAdmin)


Test patch: