Files
zulip/templates/zerver/development/dev_tools.html
Daniil Fadeev 2f203f4de1 emails: Inline CSS in emails in build_email.
Previously, we had an architecture where CSS inlining for emails was
done at provision time in inline_email_css.py. This was necessary
because the library we were using for this, Premailer, was extremely
slow, and doing the inlining for every outgoing email would have been
prohibitively expensive.

Now that we've migrated to a more modern library that inlines the
small amount of CSS we have into emails nearly instantly, we are able
to remove the complex architecture built to work around Premailer
being slow and just do the CSS inlining as the final step in sending
each individual email.

This has several significant benefits:

* Removes a fiddly provisioning step that made the edit/refresh cycle
  for modifying email templates confusing; there's no longer a CSS
  inlining step that, if you forget to do it, results in your testing a
  stale variant of the email templates.
* Fixes internationalization problems related to translators working
  with pre-CSS-inlined emails, and then Django trying to apply the
  translators to the post-CSS-inlined version.
* Makes the send_custom_email pipeline simpler and easier to improve.

Signed-off-by: Daniil Fadeev <fadeevd@zulip.com>
2023-04-05 12:22:29 -07:00

128 lines
6.0 KiB
HTML

{% extends "zerver/portico.html" %}
{% block title %}
<title>Tools and data sets | Zulip Dev</title>
{% endblock %}
{# Login page. #}
{% block portico_content %}
<div class="app flex full-page">
<div id="devtools-page" class="markdown">
<h1>Useful development URLs</h1>
<p>
Below is a list of useful tools and data sets available only in the Zulip
development environment that are often useful when contributing to Zulip.
Most of these require you to run a command to build/generate the relevant
content. This table specifies which command to use to update the data served
by each page (since several of these, like test coverage, require a special
command to be run to generate the data). Make sure your development server is still running
when you visit these!
</p>
<table class="table table-striped table-rounded table-bordered">
<thead>
<tr>
<th>URL</th>
<th>Command</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/coverage/index.html">/coverage/index.html</a></td>
<td><code>./tools/test-backend --coverage</code></td>
<td>Backend (Django) test coverage report</td>
</tr>
<tr>
<td><a href="/node-coverage/index.html">/node-coverage/index.html</a></td>
<td><code>./tools/test-js-with-node --coverage</code></td>
<td>Frontend (node) test coverage report</td>
</tr>
<tr>
<td><a href="/docs/index.html">/docs/index.html</a></td>
<td><code>./tools/build-docs</code></td>
<td>Developer documentation (ReadTheDocs) built locally</td>
</tr>
<tr>
<td><a href="/emails">/emails</a></td>
<td>View outgoing and example emails.</td>
</tr>
<tr>
<td><a href="/stats/realm/analytics/">/stats/realm/analytics/</a></td>
<td><code>./manage.py populate_analytics_db</code><br />
Run the command after changing analytics data population logic.
</td>
<td>View the /stats page with some pre-populated data</td>
</tr>
<tr>
<td><a href="/webpack/5xx.html">/webpack/5xx.html</a></td>
<td><code>./manage.py collectstatic --noinput</code></td>
<td>Error 5xx page served by nginx (used when Django is totally broken)</td>
</tr>
<tr>
<td><a href="/errors/404">/errors/404</a></td>
<td>None needed</td>
<td>Error 404 page served by Django</td>
</tr>
<tr>
<td><a href="/errors/5xx">/errors/5xx</a></td>
<td>None needed</td>
<td>Error 5xx page served by Django</td>
</tr>
<tr>
<td><a href="/accounts/do_confirm/invalid">/accounts/do_confirm/invalid</a></td>
<td>None needed</td>
<td>Invalid confirmation link page</td>
</tr>
<tr>
<td><a href="/devtools/integrations">/devtools/integrations</a></td>
<td>None needed</td>
<td>Test incoming webhook integrations</td>
</tr>
</tbody>
</table>
<h2>Useful management commands</h2>
<p>Development-specific <a href="https://zulip.readthedocs.io/en/latest/production/management-commands.html">management commands</a> live in <code>zilencer/management/commands</code>. Highlights include:
<ul>
<li><code>./manage.py populate_db</code>: Rebuilds database. Has options to e.g. create 3K users for testing.</li>
<li><code>./manage.py mark_all_messages_unread</code>: Useful for testing reading messages.</li>
<li><code>./manage.py create_realm</code>: Add a new realm. Useful for testing onboarding.</li>
<li><code>./manage.py create_user</code>: Add a new user. Useful for testing onboarding.</li>
<li><code>./manage.py add_mock_conversation</code>: Add test messages, streams, images, emoji, etc.
into the dev environment. First edit zilencer/management/commands/add_mock_conversation.py
to add the data you're testing.
</li>
</ul>
</p>
<p>We also have
<a href="https://zulip.readthedocs.io/en/latest/development/authentication.html">documentation on testing LDAP, Google &amp; GitHub authentication</a> in the development environment.
</p>
<h2>Connecting to the local PostgreSQL database</h2>
<ul>
<li>
<code>./manage.py dbshell</code>: Connect to
PostgreSQL database via your terminal.
</li>
<li>
<code>provision</code> creates a <code>~/.pgpass</code> file,
so <code>psql -U zulip -h localhost</code> works too.
</li>
<li>
<p>
To connect using a graphical PostgreSQL client
like <a href="https://www.pgadmin.org/">pgAdmin</a>,
use the following credentials:
</p>
<ul>
<li>Host: 127.0.0.1 (don't use localhost)</li>
<li>Maintenance database: zulip</li>
<li>Username: zulip</li>
<li>password: stored as <code>local_database_password</code> in <code>zulip/zproject/dev-secrets.conf</code></li>
</ul>
</li>
</ul>
</div>
</div>
{% endblock %}