[I've put the related Debian bugreport in the loop]

Hello,

I finally found some time to look into this.

Disclaimer: I don't know much about CSS compression and the mailman3 web
interface is the first time that I got into contact with either of sassc
and node-less.

TL;DR:

* Hyperkitty doesn't need (or use) less.js/lessc at all. It can safely
  be removed from COMPRESS_PRECOMPILERS.
* The situation is different with sassc, it's actually used for
  compressing CSS by hyperkitty. Doing the compression at build-time
  should be possible but requires more work. I have a plan ;)

Christian Ehrhardt:
> I have checked a fully installed mailman3 stack in Debian/Ubuntu and
> there are only two sources of .less files that we have to be concerned
> of.
> 
> First there is the package fonts-font-awesome which is pulled in on
> the following path:
> [...]
> It seems different for the second case  which is libjs-bootstrap from
> the source package twitter-bootstrap3

I don't think that any of the .less files you're referencing to will be
processed by 'django-admin compress' on the mailman3-web project. The
.less files are all outside the scope of the mailman3-web project. So
I'm pretty sure that the node-less/lessc dependency can safely be
dropped immediately.

Moreover, looking at the hyperkitty example_project/settings.py[1], it
doesn't even reference the lessc compiler at all. Only settings.py from
mailman-suite[2] references it, which probably is a copy-and-paste bug.
There's even an open issue about that[3]. Since in Debian we took the
mailman-suite settings.py as template, we suffer from this
copy-and-paste bug as well.

[1]
https://gitlab.com/mailman/hyperkitty/blob/master/example_project/settings.py#L315-317
[2]
https://gitlab.com/mailman/mailman-suite/blob/master/mailman-suite_project/settings.py#L359-362
[3] https://gitlab.com/mailman/mailman-suite/issues/7

> Does anyone know of other uses of .less in the mailman3 stack that I
> have missed that we would have to think about?

Regarding sassc: Hyperkitty is the only part of the mailman3 stack that
uses django-compressor. And apparently there's just one single html
template that will be processed by sassc (well, to be precise, all html
files that use this template):

/usr/lib/python3/dist-packages/hyperkitty/templates/hyperkitty/base.html

In this file, four CSS files are being compressed and packed together by
sassc:

hyperkitty/libs/fonts/icomoon/icomoon.css
hyperkitty/libs/fonts/droid/droid.css
django-mailman3/css/main.css
hyperkitty/sass/hyperkitty.scss

The last one is special as it's a scss file itself and needs to be
processed by sassc itself.

> OTOH there also is an experimental approach to this, could someone
> with a dev-stack of mailman3 just remove the node-less package and see
> if on a normal setup something breaks at all?

I've done this. Result: removing node-less doesn't change anything
(which is in line with my assumption that node-less/less.js/lessc is not
required/used at all).

On the other hand, removing sassc breaks the setup, even with
COMPRESS_OFFLINE being turned on:

CommandError: An error occurred during rendering
/usr/lib/python3/dist-packages/django_mailman3/templates/django_mailman3/profile/delete_profile.html:
/bin/sh: 1: sassc: not found

Christian Ehrhardt:
> On Fri, Mar 15, 2019 at 10:19 AM Jonas Smedegaard <d...@jones.dk> wrote:
>>
>> Quoting Christian Ehrhardt (2019-03-15 06:39:08)
>>> On Fri, Mar 15, 2019 at 12:08 AM Abhilash Raj <maxk...@asynchronous.in> 
>>> wrote:
>>>> On Thu, Mar 14, 2019, at 1:42 PM, Jonas Meurer wrote:
>>>> Christian Ehrhardt:
>>>>> I was evaluating the Dependencies of mailman3 in Ubuntu and I was
>>>>> wondering if I could cut them down a bit. One thing that got my
>>>>> attention is the dependency from mailman3-web [1] to nodejs for
>>>>> less [2] and ruby-sass [3].
>>>>>
>>>>> I was wondering if we could by default not install
>>>>> node-less/ruby-sass and what exactly that would imply.
>>
>> less is a reinvention of sass: It is often adaptable to sass with a
>> simple patch.
>>
>> Original sass processor was ruby-sass, but nowadays a better processor
>> is sassc.  Or if you want to integrated processing with Python then
>> python3-libsass which uses same core library for its processing.
>>
>> I have not looked closely on mailman3, but I highly doubt there is a
>> real need for dynamic processing of less/sass during runtime.
> 
> Yeah I doubt that as well.
> In the meantime I also found [1] which seems to have come to the same
> conclusion for the majority of default setups.

> For upstream to disable it by default it was mentioned that there is a
> need for a customize kit which seems fine [1].
> 
> There is a further argument to disable the live compressors, at least
> as I read COMPRESS_OFFLINE that seems helpful for production setups
> anyway to speed up and safe CPU load.

You're totally right. Therefore, COMPRESS_OFFLINE is already enabled per
default in mailman3-web on Debian. The django-admin compress command is
executed during package installation and upgrade by the package postinst
script.

> So while upstream waits until a "customize kit" exists to switch
> defaults, as a downstream like Debian/Ubuntu I wonder if we already
> could:
> - drop sass/less compilers to a suggest
> - disable the live compression in the default config that we ship
> - keep the config commented-out to make it easy for admins that want
> to enable it later
> - pre-compress at build time and enable compress_offline for speed
>   - maybe call `django_admin compress` [3][4] or similar at build time?
>   - having sass/less as build dependencies seems much safer than
> pulling it in at runtime
> 
> @Jonas M.: what do you think about [2] (again maybe after Buster)?
> Sorry to not know more of this yet, but I hope suggesting what I think
> might work helps to get us the right way.

I'm absolutely in favour of getting rid of the sassc runtime dependency.
After a chat with Jonas Smedegaard (thanks for his valuable input!), I
think that I have an idea and a roadmap on how to get there:

1. Process `static/hyperkittysass/hyperkitty.scss` with sassc at build-
   time and patch `templates/hyperkitty/base.html` to reference the
   resulting CSS file.
2. Patch base.html at build-time to remove the '{% compress css %}'
   statements from it.

By then, we already can safely drop the run-time dependency on
django-compressor from hyperkitty since it won't be needed anymore and
consequently remove sassc dependency from mailman3-web (and all
references to django-compressor from settings.py).

The downside will be some performance decrease as hyperkitty pages will
reference four separate CSS file instead of a combined one. But that can
be addressed as well:

3. Make python3-django-mailman3 a build-dependency of mailman-suite (one
   of the referenced CSS files is shipped by django-mailman3) and
   combine all four CSS files into one by runing sassc at build-time.
4. Further patch base.html at build-time to replace the four separate
   CSS references by one to the resulting combined CSS.

I plan to start working on the actual implementation soon but would be
glad to hear your thoughts on it.

Cheers
 jonas

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Mailman-Developers mailing list -- mailman-developers@python.org
To unsubscribe send an email to mailman-developers-le...@python.org
https://mail.python.org/mailman3/lists/mailman-developers.python.org/
Mailman FAQ: https://wiki.list.org/x/AgA3

Security Policy: https://wiki.list.org/x/QIA9

Reply via email to