Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Andy Chosak
Automatic slug generation in ModelAdmin via prepopulated_fields uses a urlify.js file which, among other behaviors, removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket #30538 mentions this behavior as part of a more general comparison between urlify.js and Python slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example #2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example #12905. See also wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Adam Johnson-2
I for one am quite surprised to learn the admin has this behaviour.

I'm extra surprised it assumes it's in English if only ASCII letters are used. This is quite a naïve assumption 😂 (See what I did in that sentence?)

Was removal of these words introduced for SEO reasons?

Seems likely.

Personally, for the reasons you've presented I think it would make sense to remove this behaviour. We can probably document how to wrap window.URLify to preserve the old behaviour.

On Wed, 8 Apr 2020 at 20:38, Andy Chosak <[hidden email]> wrote:
Automatic slug generation in ModelAdmin via prepopulated_fields uses a urlify.js file which, among other behaviors, removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket #30538 mentions this behavior as part of a more general comparison between urlify.js and Python slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example #2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example #12905. See also wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAMyDDM2NsRwp_EcoyBO5QJ7VYF2na20oWC6udkNfo1uAi7eS%2Bw%40mail.gmail.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Andy Chosak
Thanks, Adam, for your reply. I've opened a ticket at https://code.djangoproject.com/ticket/31511, which includes a link to a PR that makes this change.

Any advice on documenting how to wrap window.URLify?

Thanks,
Andy

On Thursday, April 9, 2020 at 1:41:30 PM UTC-4, Adam Johnson wrote:
I for one am quite surprised to learn the admin has this behaviour.

I'm extra surprised it assumes it's in English if only ASCII letters are used. This is quite a naïve assumption 😂 (See what I did in that sentence?)

Was removal of these words introduced for SEO reasons?

Seems likely.

Personally, for the reasons you've presented I think it would make sense to remove this behaviour. We can probably document how to wrap window.URLify to preserve the old behaviour.

On Wed, 8 Apr 2020 at 20:38, Andy Chosak <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="fKXHYG7DDQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">cho...@...> wrote:
Automatic slug generation in ModelAdmin via <a href="https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Fref%2Fcontrib%2Fadmin%2F%23django.contrib.admin.ModelAdmin.prepopulated_fields\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT9DOQW4eMtHbIZ8xn18JEYVTpEA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Fref%2Fcontrib%2Fadmin%2F%23django.contrib.admin.ModelAdmin.prepopulated_fields\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT9DOQW4eMtHbIZ8xn18JEYVTpEA&#39;;return true;">prepopulated_fields uses a <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/contrib/admin/static/admin/js/urlify.js" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFz56R20i16cdRywP50kUaesZ3JPg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFz56R20i16cdRywP50kUaesZ3JPg&#39;;return true;">urlify.js file which, among other behaviors, <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/contrib/admin/static/admin/js/urlify.js#L168-L176" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js%23L168-L176\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT7ZhhmvIIePkQ4CGy4W7k_Mz-fg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js%23L168-L176\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT7ZhhmvIIePkQ4CGy4W7k_Mz-fg&#39;;return true;">removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket <a href="https://code.djangoproject.com/ticket/30538" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F30538\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG9QNzpzdTa8XAB_oXsDC_5nLllAw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F30538\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG9QNzpzdTa8XAB_oXsDC_5nLllAw&#39;;return true;">#30538 mentions this behavior as part of a more general comparison between urlify.js and Python <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/utils/text.py#L394" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Futils%2Ftext.py%23L394\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHtD4KB8NfY2KEehv4nvexIlmwEwA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Futils%2Ftext.py%23L394\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHtD4KB8NfY2KEehv4nvexIlmwEwA&#39;;return true;">slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the <a href="https://docs.djangoproject.com/en/3.0/internals/contributing/triaging-tickets/#closing-tickets" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Finternals%2Fcontributing%2Ftriaging-tickets%2F%23closing-tickets\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNE3iJh5guT8lozGqQ_XUxWmACBTFw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Finternals%2Fcontributing%2Ftriaging-tickets%2F%23closing-tickets\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNE3iJh5guT8lozGqQ_XUxWmACBTFw&#39;;return true;">triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example <a href="https://code.djangoproject.com/ticket/2282" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F2282\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGYKs9czqH1Yp8fYVW8otwX0bkaTw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F2282\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGYKs9czqH1Yp8fYVW8otwX0bkaTw&#39;;return true;">#2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same <a href="https://github.com/django/django/blob/dd5320d1d56ca7603747dd68871e72eee99d9e67/media/js/urlify.js" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fdd5320d1d56ca7603747dd68871e72eee99d9e67%2Fmedia%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFJm0O7411Wv8BsMiO2kHxVM99f2Q&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fdd5320d1d56ca7603747dd68871e72eee99d9e67%2Fmedia%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFJm0O7411Wv8BsMiO2kHxVM99f2Q&#39;;return true;">since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. <a href="https://cseo.com/blog/google-stop-words/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcseo.com%2Fblog%2Fgoogle-stop-words%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEACCWu-6eMEZFdnx6x_UzICvwbtA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcseo.com%2Fblog%2Fgoogle-stop-words%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEACCWu-6eMEZFdnx6x_UzICvwbtA&#39;;return true;">Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but <a href="https://yoast.com/yoast-seo-7-0/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fyoast.com%2Fyoast-seo-7-0%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGuyGgsGQuJx-wYbb72Rg99GyonQA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fyoast.com%2Fyoast-seo-7-0%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGuyGgsGQuJx-wYbb72Rg99GyonQA&#39;;return true;">stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example <a href="https://code.djangoproject.com/ticket/12905" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F12905\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGhsnOP7ftf4a58TeMMB56Lv_hXSA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F12905\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGhsnOP7ftf4a58TeMMB56Lv_hXSA&#39;;return true;">#12905. See also <a href="https://github.com/wagtail/wagtail/issues/4899" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fwagtail%2Fwagtail%2Fissues%2F4899\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEKVXZlbXGKClanHSxCXcTzTv9-Ww&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fwagtail%2Fwagtail%2Fissues%2F4899\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEKVXZlbXGKClanHSxCXcTzTv9-Ww&#39;;return true;">wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="fKXHYG7DDQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">django-d...@googlegroups.com.
To view this discussion on the web visit <a href="https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium=email&amp;utm_source=footer" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;">https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/8f1e9719-da61-421a-97a1-9313ee0dd8db%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Adam Johnson-2
I agree with Mariusz on the ticket/PR that my answer alone isn't enough impetus to make this change. Hopefully someone more involved in i18n can weigh in.

Although it changes the order of operations, I think this still works to achieve the same behaviour. This snippet can be run at the end of a page to wrap window.URLify.

(function () {
    const originalURLify = window.URLify;
   
    function URLify(s, num_chars, allowUnicode) {
        let result = originalURLify(s, num_chars, allowUnicode);
       
        const hadUnicodeChars = /[^\u0000-\u007f]/.test(s);
        // Remove English words only if the string contains ASCII (English)
        // characters.
        if (!hasUnicodeChars) {
            const removeList = [
                "a", "an", "as", "at", "before", "but", "by", "for", "from",
                "is", "in", "into", "like", "of", "off", "on", "onto", "per",
                "since", "than", "the", "this", "that", "to", "up", "via",
                "with"
            ];
            const r = new RegExp('\\b(' + removeList.join('|') + ')\\b', 'gi');
            result = result.replace(r, '');
        }
        return result;
    };
   
    window.URLify = newURlify;
})();

On Thu, 23 Apr 2020 at 21:21, Andy Chosak <[hidden email]> wrote:
Thanks, Adam, for your reply. I've opened a ticket at https://code.djangoproject.com/ticket/31511, which includes a link to a PR that makes this change.

Any advice on documenting how to wrap window.URLify?

Thanks,
Andy

On Thursday, April 9, 2020 at 1:41:30 PM UTC-4, Adam Johnson wrote:
I for one am quite surprised to learn the admin has this behaviour.

I'm extra surprised it assumes it's in English if only ASCII letters are used. This is quite a naïve assumption 😂 (See what I did in that sentence?)

Was removal of these words introduced for SEO reasons?

Seems likely.

Personally, for the reasons you've presented I think it would make sense to remove this behaviour. We can probably document how to wrap window.URLify to preserve the old behaviour.

On Wed, 8 Apr 2020 at 20:38, Andy Chosak <[hidden email]> wrote:
Automatic slug generation in ModelAdmin via prepopulated_fields uses a urlify.js file which, among other behaviors, removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket #30538 mentions this behavior as part of a more general comparison between urlify.js and Python slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example #2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example #12905. See also wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/8f1e9719-da61-421a-97a1-9313ee0dd8db%40googlegroups.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAMyDDM0fOEXVyP%2Br1Eyw1izE7TFGCcE5i2STqpAWUFsjumhBVA%40mail.gmail.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Scott Cranfill
Does anyone else have an opinion on whether or not we should still be removing these stopwords?

Hopefully someone more involved in i18n can weigh in.

I'm not sure if there are any i18n concerns here. In fact, ceasing this practice removes the impetus for the recurring issues being raised about how this practice negatively affects the experience for users of other languages, or doesn't remove words in their language, etc.

Thanks for the suggested code, Adam. On the topic of deprecation, in general: Andy I weren't really sure how to approach that for a JavaScript-only change. We can't throw deprecation warnings in the Django console like we could if we were talking about Python code, can we? I could see adding some more aggressive messaging, maybe even in the Admin?

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/9bae6eba-2046-4270-b16b-69fe2b2c8e87%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Tim Graham-2
I'm in favor of the change. It seems to me that most slugs I see these days have stop words in them and they read better because of that. I don't think JavaScript warnings would be helpful. A release note is sufficient. Admin users still get a preview of the slug and can edit it if needed.

On Friday, May 15, 2020 at 6:44:12 PM UTC-4, Scott Cranfill wrote:
Does anyone else have an opinion on whether or not we should still be removing these stopwords?

Hopefully someone more involved in i18n can weigh in.

I'm not sure if there are any i18n concerns here. In fact, ceasing this practice removes the impetus for the recurring issues being raised about how this practice negatively affects the experience for users of other languages, or doesn't remove words in their language, etc.

Thanks for the suggested code, Adam. On the topic of deprecation, in general: Andy I weren't really sure how to approach that for a JavaScript-only change. We can't throw deprecation warnings in the Django console like we could if we were talking about Python code, can we? I could see adding some more aggressive messaging, maybe even in the Admin?

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/bd4e8c7d-4f7e-4c00-9e8b-49378eb261ee%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

אורי
In reply to this post by Andy Chosak
I very much prefer a slug "to-be-or-not-to-be-that-is-the-question" than "be-or-not-be-question" (which doesn't make sense).


On Wed, Apr 8, 2020 at 11:35 PM Andy Chosak <[hidden email]> wrote:
Automatic slug generation in ModelAdmin via prepopulated_fields uses a urlify.js file which, among other behaviors, removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket #30538 mentions this behavior as part of a more general comparison between urlify.js and Python slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example #2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example #12905. See also wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Adam Johnson-2
There's a bit more support now, and there have been no opinions against it.

Because of this I've reopened the older closed ticket #11157: https://code.djangoproject.com/ticket/11157 . Andy/Scott, I hope you can retarget your PR as per my comment there. Thanks!

Admin users still get a preview of the slug and can edit it if needed.

Agree, no need for deprecation warnings. This behaviour is in front of users with an easy override.

‪On Sat, 16 May 2020 at 03:04, ‫אורי‬‎ <[hidden email]> wrote:‬
I very much prefer a slug "to-be-or-not-to-be-that-is-the-question" than "be-or-not-be-question" (which doesn't make sense).


On Wed, Apr 8, 2020 at 11:35 PM Andy Chosak <[hidden email]> wrote:
Automatic slug generation in ModelAdmin via prepopulated_fields uses a urlify.js file which, among other behaviors, removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket #30538 mentions this behavior as part of a more general comparison between urlify.js and Python slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example #2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example #12905. See also wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAMyDDM3iB6szvMcQQ_LYJiODRACuq9%2Be6seQ%2BQih7Uu7Q3btLg%40mail.gmail.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Scott Cranfill
Thanks for the additional feedback, folks!

We have opened a fresh PR, rebased on the latest master and referencing #11157, at https://github.com/django/django/pull/12945

Best,
Scott


On Saturday, May 16, 2020 at 5:25:29 AM UTC-4, Adam Johnson wrote:
There's a bit more support now, and there have been no opinions against it.

Because of this I've reopened the older closed ticket #11157:<a href="https://code.djangoproject.com/ticket/11157" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F11157\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHUJAdb--Aqr0HNuuV50249XgTbIQ&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F11157\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHUJAdb--Aqr0HNuuV50249XgTbIQ&#39;;return true;"> https://code.djangoproject.com/ticket/11157 . Andy/Scott, I hope you can retarget your PR as per my comment there. Thanks!

Admin users still get a preview of the slug and can edit it if needed.

Agree, no need for deprecation warnings. This behaviour is in front of users with an easy override.

‪On Sat, 16 May 2020 at 03:04, ‫אורי‬‎ <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="blxym6MXAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">u...@...> wrote:‬
I very much prefer a slug "to-be-or-not-to-be-that-is-the-question" than "be-or-not-be-question" (which doesn't make sense).
אורי
<a href="javascript:" target="_blank" gdf-obfuscated-mailto="blxym6MXAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">u...@...


On Wed, Apr 8, 2020 at 11:35 PM Andy Chosak <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="blxym6MXAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">cho...@...> wrote:
Automatic slug generation in ModelAdmin via <a href="https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Fref%2Fcontrib%2Fadmin%2F%23django.contrib.admin.ModelAdmin.prepopulated_fields\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT9DOQW4eMtHbIZ8xn18JEYVTpEA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Fref%2Fcontrib%2Fadmin%2F%23django.contrib.admin.ModelAdmin.prepopulated_fields\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT9DOQW4eMtHbIZ8xn18JEYVTpEA&#39;;return true;">prepopulated_fields uses a <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/contrib/admin/static/admin/js/urlify.js" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFz56R20i16cdRywP50kUaesZ3JPg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFz56R20i16cdRywP50kUaesZ3JPg&#39;;return true;">urlify.js file which, among other behaviors, <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/contrib/admin/static/admin/js/urlify.js#L168-L176" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js%23L168-L176\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT7ZhhmvIIePkQ4CGy4W7k_Mz-fg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js%23L168-L176\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT7ZhhmvIIePkQ4CGy4W7k_Mz-fg&#39;;return true;">removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket <a href="https://code.djangoproject.com/ticket/30538" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F30538\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG9QNzpzdTa8XAB_oXsDC_5nLllAw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F30538\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG9QNzpzdTa8XAB_oXsDC_5nLllAw&#39;;return true;">#30538 mentions this behavior as part of a more general comparison between urlify.js and Python <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/utils/text.py#L394" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Futils%2Ftext.py%23L394\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHtD4KB8NfY2KEehv4nvexIlmwEwA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Futils%2Ftext.py%23L394\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHtD4KB8NfY2KEehv4nvexIlmwEwA&#39;;return true;">slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the <a href="https://docs.djangoproject.com/en/3.0/internals/contributing/triaging-tickets/#closing-tickets" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Finternals%2Fcontributing%2Ftriaging-tickets%2F%23closing-tickets\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNE3iJh5guT8lozGqQ_XUxWmACBTFw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Finternals%2Fcontributing%2Ftriaging-tickets%2F%23closing-tickets\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNE3iJh5guT8lozGqQ_XUxWmACBTFw&#39;;return true;">triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example <a href="https://code.djangoproject.com/ticket/2282" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F2282\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGYKs9czqH1Yp8fYVW8otwX0bkaTw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F2282\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGYKs9czqH1Yp8fYVW8otwX0bkaTw&#39;;return true;">#2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same <a href="https://github.com/django/django/blob/dd5320d1d56ca7603747dd68871e72eee99d9e67/media/js/urlify.js" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fdd5320d1d56ca7603747dd68871e72eee99d9e67%2Fmedia%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFJm0O7411Wv8BsMiO2kHxVM99f2Q&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fdd5320d1d56ca7603747dd68871e72eee99d9e67%2Fmedia%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFJm0O7411Wv8BsMiO2kHxVM99f2Q&#39;;return true;">since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. <a href="https://cseo.com/blog/google-stop-words/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcseo.com%2Fblog%2Fgoogle-stop-words%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEACCWu-6eMEZFdnx6x_UzICvwbtA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcseo.com%2Fblog%2Fgoogle-stop-words%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEACCWu-6eMEZFdnx6x_UzICvwbtA&#39;;return true;">Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but <a href="https://yoast.com/yoast-seo-7-0/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fyoast.com%2Fyoast-seo-7-0%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGuyGgsGQuJx-wYbb72Rg99GyonQA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fyoast.com%2Fyoast-seo-7-0%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGuyGgsGQuJx-wYbb72Rg99GyonQA&#39;;return true;">stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example <a href="https://code.djangoproject.com/ticket/12905" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F12905\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGhsnOP7ftf4a58TeMMB56Lv_hXSA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F12905\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGhsnOP7ftf4a58TeMMB56Lv_hXSA&#39;;return true;">#12905. See also <a href="https://github.com/wagtail/wagtail/issues/4899" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fwagtail%2Fwagtail%2Fissues%2F4899\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEKVXZlbXGKClanHSxCXcTzTv9-Ww&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fwagtail%2Fwagtail%2Fissues%2F4899\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEKVXZlbXGKClanHSxCXcTzTv9-Ww&#39;;return true;">wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="blxym6MXAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">django-d...@googlegroups.com.
To view this discussion on the web visit <a href="https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium=email&amp;utm_source=footer" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;">https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="blxym6MXAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">django-d...@googlegroups.com.
To view this discussion on the web visit <a href="https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com?utm_medium=email&amp;utm_source=footer" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;">https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/cf166ba2-162e-4adf-a0bc-2ef79365d1e9%40googlegroups.com.
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Allow stopwords in slugs generated by ModelAdmin.prepopulated_fields

Scott Cranfill
The PR was merged! Thanks everyone for your input and assistance.

On Wednesday, May 20, 2020 at 12:51:56 PM UTC-4, Scott Cranfill wrote:
Thanks for the additional feedback, folks!

We have opened a fresh PR, rebased on the latest master and referencing #11157, at <a href="https://github.com/django/django/pull/12945" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fpull%2F12945\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFf_IT4GAZbAG2rlZLuTrKLIY7rXA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fpull%2F12945\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFf_IT4GAZbAG2rlZLuTrKLIY7rXA&#39;;return true;">https://github.com/django/django/pull/12945

Best,
Scott


On Saturday, May 16, 2020 at 5:25:29 AM UTC-4, Adam Johnson wrote:
There's a bit more support now, and there have been no opinions against it.

Because of this I've reopened the older closed ticket #11157:<a href="https://code.djangoproject.com/ticket/11157" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F11157\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHUJAdb--Aqr0HNuuV50249XgTbIQ&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F11157\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHUJAdb--Aqr0HNuuV50249XgTbIQ&#39;;return true;"> https://code.djangoproject.com/ticket/11157 . Andy/Scott, I hope you can retarget your PR as per my comment there. Thanks!

Admin users still get a preview of the slug and can edit it if needed.

Agree, no need for deprecation warnings. This behaviour is in front of users with an easy override.

‪On Sat, 16 May 2020 at 03:04, ‫אורי‬‎ <[hidden email]> wrote:‬
I very much prefer a slug "to-be-or-not-to-be-that-is-the-question" than "be-or-not-be-question" (which doesn't make sense).


On Wed, Apr 8, 2020 at 11:35 PM Andy Chosak <[hidden email]> wrote:
Automatic slug generation in ModelAdmin via <a href="https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Fref%2Fcontrib%2Fadmin%2F%23django.contrib.admin.ModelAdmin.prepopulated_fields\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT9DOQW4eMtHbIZ8xn18JEYVTpEA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Fref%2Fcontrib%2Fadmin%2F%23django.contrib.admin.ModelAdmin.prepopulated_fields\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT9DOQW4eMtHbIZ8xn18JEYVTpEA&#39;;return true;">prepopulated_fields uses a <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/contrib/admin/static/admin/js/urlify.js" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFz56R20i16cdRywP50kUaesZ3JPg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFz56R20i16cdRywP50kUaesZ3JPg&#39;;return true;">urlify.js file which, among other behaviors, <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/contrib/admin/static/admin/js/urlify.js#L168-L176" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js%23L168-L176\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT7ZhhmvIIePkQ4CGy4W7k_Mz-fg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Fcontrib%2Fadmin%2Fstatic%2Fadmin%2Fjs%2Furlify.js%23L168-L176\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGT7ZhhmvIIePkQ4CGy4W7k_Mz-fg&#39;;return true;">removes certain stop words from the slug. For example, a string like "To be or not to be, that is the question" will generate a slug "be-or-not-be-question", not "to-be-or-not-to-be-that-is-the-question" as one might expect. I’d like to solicit feedback on the idea of removing this logic so that slugs can contain these words.

For reference, the current list is: a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with.

Django ticket <a href="https://code.djangoproject.com/ticket/30538" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F30538\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG9QNzpzdTa8XAB_oXsDC_5nLllAw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F30538\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG9QNzpzdTa8XAB_oXsDC_5nLllAw&#39;;return true;">#30538 mentions this behavior as part of a more general comparison between urlify.js and Python <a href="https://github.com/django/django/blob/b2bd08bb7a912a1504f5fb5018f5317e6b5423cd/django/utils/text.py#L394" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Futils%2Ftext.py%23L394\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHtD4KB8NfY2KEehv4nvexIlmwEwA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fb2bd08bb7a912a1504f5fb5018f5317e6b5423cd%2Fdjango%2Futils%2Ftext.py%23L394\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHtD4KB8NfY2KEehv4nvexIlmwEwA&#39;;return true;">slugify. It was closed as wontfix due to reasons of backwards compatibility. Per the <a href="https://docs.djangoproject.com/en/3.0/internals/contributing/triaging-tickets/#closing-tickets" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Finternals%2Fcontributing%2Ftriaging-tickets%2F%23closing-tickets\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNE3iJh5guT8lozGqQ_XUxWmACBTFw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fdocs.djangoproject.com%2Fen%2F3.0%2Finternals%2Fcontributing%2Ftriaging-tickets%2F%23closing-tickets\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNE3iJh5guT8lozGqQ_XUxWmACBTFw&#39;;return true;">triaging guidelines, I’m making this post to solicit feedback on the more specific question of addressing stopword removal in the JS code only -- not to try to address any other differences in behavior between these two methods. There’s been quite a bit of discussion on generating slugs for non-English languages (for example <a href="https://code.djangoproject.com/ticket/2282" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F2282\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGYKs9czqH1Yp8fYVW8otwX0bkaTw&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F2282\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGYKs9czqH1Yp8fYVW8otwX0bkaTw&#39;;return true;">#2282), and this post is not intended to reopen that discussion.

The current list of stopwords being removed seems to have been the same <a href="https://github.com/django/django/blob/dd5320d1d56ca7603747dd68871e72eee99d9e67/media/js/urlify.js" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fdd5320d1d56ca7603747dd68871e72eee99d9e67%2Fmedia%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFJm0O7411Wv8BsMiO2kHxVM99f2Q&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fdjango%2Fdjango%2Fblob%2Fdd5320d1d56ca7603747dd68871e72eee99d9e67%2Fmedia%2Fjs%2Furlify.js\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFJm0O7411Wv8BsMiO2kHxVM99f2Q&#39;;return true;">since at least 2005 (the earliest code I can find including this logic). Some of these words feel a little unexpected, for example “before” and “since”. After 15 years it seems reasonable to revisit the list and consider whether it still makes sense.

Was removal of these words introduced for SEO reasons? If so, is this still a recommended default behavior? In 2020, search engines like Google seem smart enough to interpret them properly. <a href="https://cseo.com/blog/google-stop-words/" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcseo.com%2Fblog%2Fgoogle-stop-words%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEACCWu-6eMEZFdnx6x_UzICvwbtA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcseo.com%2Fblog%2Fgoogle-stop-words%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEACCWu-6eMEZFdnx6x_UzICvwbtA&#39;;return true;">Here's an arbitrary page that discusses this and includes a much longer list of what might be considered stopwords. As another datapoint, the popular WordPress Yoast SEO plugin used to remove stopwords, but <a href="https://yoast.com/yoast-seo-7-0/" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fyoast.com%2Fyoast-seo-7-0%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGuyGgsGQuJx-wYbb72Rg99GyonQA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fyoast.com%2Fyoast-seo-7-0%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGuyGgsGQuJx-wYbb72Rg99GyonQA&#39;;return true;">stopped doing so a few years back.

Potentially outdated SEO concerns aside, does this behavior still align well with the needs and desires of Django users? Is this something this community would be open to revisiting? Thanks for your consideration.

(One minor point on language support: allowing these words would help to resolve at least some of the unequal treatment given to English over other languages, for example <a href="https://code.djangoproject.com/ticket/12905" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F12905\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGhsnOP7ftf4a58TeMMB56Lv_hXSA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fcode.djangoproject.com%2Fticket%2F12905\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGhsnOP7ftf4a58TeMMB56Lv_hXSA&#39;;return true;">#12905. See also <a href="https://github.com/wagtail/wagtail/issues/4899" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fwagtail%2Fwagtail%2Fissues%2F4899\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEKVXZlbXGKClanHSxCXcTzTv9-Ww&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fwagtail%2Fwagtail%2Fissues%2F4899\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEKVXZlbXGKClanHSxCXcTzTv9-Ww&#39;;return true;">wagtail#4899, from which much of this post has been copied, for an example of how this logic impacts a Django-based CMS.)

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit <a href="https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium=email&amp;utm_source=footer" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;">https://groups.google.com/d/msgid/django-developers/fb6c9596-951d-4102-91b5-b5fd9c8c6340%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit <a href="https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com?utm_medium=email&amp;utm_source=footer" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;">https://groups.google.com/d/msgid/django-developers/CABD5YeG3G_NCp%3DjGcGggMg1zCUMd-DPAZo2pEJgC5UaM__k4ww%40mail.gmail.com.


--
Adam

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/de100786-9b69-4396-b594-4595f8103984%40googlegroups.com.