mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
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>
128 lines
6.0 KiB
HTML
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 & 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 %}
|