mirror of https://github.com/zulip/zulip.git
74 lines
2.4 KiB
ReStructuredText
74 lines
2.4 KiB
ReStructuredText
|
====================
|
||
|
New Feature Tutorial
|
||
|
====================
|
||
|
|
||
|
The changes needed to add a new feature will vary, of course. We give an
|
||
|
example here that illustrates some of the common steps needed. We describe
|
||
|
the process of adding a new setting for admins that restricts inviting new
|
||
|
users to admins only.
|
||
|
|
||
|
Backend Changes
|
||
|
===============
|
||
|
|
||
|
Adding a field to the database
|
||
|
------------------------------
|
||
|
|
||
|
The server accesses the underlying database in `zerver/models.py`. Add
|
||
|
a new field in the appropriate class, `realm_invite_by_admins_only`
|
||
|
in the `Realm` class in this case.
|
||
|
|
||
|
Once you do so, you need to migrate the database. See the page on schema changes
|
||
|
for more details.
|
||
|
|
||
|
.. attention::
|
||
|
Add link to schema-changes
|
||
|
|
||
|
Backend changes
|
||
|
---------------
|
||
|
|
||
|
You should add code in `zerver/lib/actions.py` to interact with the database,
|
||
|
that actually updates the relevant field. In this case, `do_set_realm_invite_by_admins_only`
|
||
|
is a function that actually updates the field in the database, and sends
|
||
|
an event announcing that this change has been made.
|
||
|
|
||
|
You then need update the `fetch_initial_state_data` and `apply_events` functions
|
||
|
in `zerver/lib/actions.py` to update the state based on the event you just created.
|
||
|
In this case, we add a line
|
||
|
|
||
|
::
|
||
|
|
||
|
state['realm_invite_by_admins_only'] = user_profile.realm.invite_by_admins_only`
|
||
|
|
||
|
to the `fetch_initial_state_data` function. The `apply_events` function
|
||
|
doesn't need to be updated since
|
||
|
|
||
|
::
|
||
|
|
||
|
elif event['type'] == 'realm':
|
||
|
field = 'realm_' + event['property']
|
||
|
state[field] = event['value']
|
||
|
|
||
|
already took care of our event.
|
||
|
|
||
|
Then update `zerver/views/__init__.py` to actually call your function.
|
||
|
In the dictionary which sets the javascript `page_params` dictionary,
|
||
|
add
|
||
|
|
||
|
::
|
||
|
|
||
|
realm_invite_by_admins_only = register_ret['realm_invite_by_admins_only']
|
||
|
|
||
|
Perhaps your new option controls some other backend rendering: in our case
|
||
|
we test for this option in the `home` method for adding a variable to the response.
|
||
|
The functions in this file control the generation of various pages served
|
||
|
(along with the Django templates).
|
||
|
Our new feature also shows up in the administration tab (as a checkbox),
|
||
|
so we need to update the `update_realm` function.
|
||
|
|
||
|
Frontend changes
|
||
|
----------------
|
||
|
|
||
|
You need to change various things on the front end. In this case, the relevant files
|
||
|
are `static/js/server_events.js`, `static/js/admin.js`, `static/styles/zulip.css
|
||
|
and `static/templates/admin_tab.handlebars`.
|