views/realm_aliases.py: Use domain instead of id as handle for RealmAlias.

We need to make the change for the API, and the next commit introduces a
unique_together constraint on (realm, domain) anyway.
This commit is contained in:
Harshit Bansal
2017-01-21 00:09:27 -08:00
committed by Tim Abbott
parent 06cc306d00
commit b4186fdfdd
10 changed files with 29 additions and 37 deletions

View File

@@ -95,7 +95,6 @@ function render(template_name, args) {
var html = "<table>"; var html = "<table>";
var args = { var args = {
alias: { alias: {
id: 1,
domain: 'zulip.org', domain: 'zulip.org',
}, },
}; };
@@ -104,16 +103,11 @@ function render(template_name, args) {
var button = $(html).find('.btn'); var button = $(html).find('.btn');
var domain = $(html).find('.domain'); var domain = $(html).find('.domain');
var row = button.closest('tr');
assert.equal(button.text().trim(), "Remove"); assert.equal(button.text().trim(), "Remove");
assert(button.hasClass("delete_alias")); assert(button.hasClass("delete_alias"));
assert.equal(button.data("id"), "1");
assert.equal(domain.text(), "zulip.org"); assert.equal(domain.text(), "zulip.org");
assert.equal(row.attr("id"), "alias_1");
global.write_handlebars_output("admin-alias-list", html); global.write_handlebars_output("admin-alias-list", html);
}()); }());

View File

@@ -902,7 +902,8 @@ function _setup_page() {
}); });
$("#alias_table").on("click", ".delete_alias", function () { $("#alias_table").on("click", ".delete_alias", function () {
var url = "/json/realm/domains/" + $(this).data('id'); var domain = $(this).parents("tr").find(".domain").text();
var url = "/json/realm/domains/" + domain;
var aliases_info = $("#realm_aliases_modal").find(".aliases_info"); var aliases_info = $("#realm_aliases_modal").find(".aliases_info");
channel.del({ channel.del({

View File

@@ -113,7 +113,7 @@ function dispatch_normal_event(event) {
} else if (event.op === 'remove') { } else if (event.op === 'remove') {
var i; var i;
for (i = 0; i < page_params.domains.length; i += 1) { for (i = 0; i < page_params.domains.length; i += 1) {
if (page_params.domains[i].id === event.alias_id) { if (page_params.domains[i].domain === event.domain) {
page_params.domains.splice(i, 1); page_params.domains.splice(i, 1);
break; break;
} }

View File

@@ -1,6 +1,6 @@
{{#with alias}} {{#with alias}}
<tr id="alias_{{id}}"> <tr>
<td class="domain">{{domain}}</td> <td class="domain">{{domain}}</td>
<td><button class="btn btn-danger btn-sm delete_alias" data-id="{{id}}">{{t "Remove" }}</button></td> <td><button class="btn btn-danger btn-sm delete_alias">{{t "Remove" }}</button></td>
</tr> </tr>
{{/with}} {{/with}}

View File

@@ -3321,7 +3321,7 @@ def apply_events(state, events, user_profile):
if event['op'] == 'add': if event['op'] == 'add':
state['realm_domains'].append(event['alias']) state['realm_domains'].append(event['alias'])
elif event['op'] == 'remove': elif event['op'] == 'remove':
state['realm_domains'] = [alias for alias in state['realm_domains'] if alias['id'] != event['alias_id']] state['realm_domains'] = [alias for alias in state['realm_domains'] if alias['domain'] != event['domain']]
elif event['type'] == "realm_emoji": elif event['type'] == "realm_emoji":
state['realm_emoji'] = event['realm_emoji'] state['realm_emoji'] = event['realm_emoji']
elif event['type'] == "alert_words": elif event['type'] == "alert_words":
@@ -3685,24 +3685,21 @@ def get_emails_from_user_ids(user_ids):
def get_realm_aliases(realm): def get_realm_aliases(realm):
# type: (Realm) -> List[Dict[str, Text]] # type: (Realm) -> List[Dict[str, Text]]
return list(realm.realmalias_set.values('id', 'domain')) return list(realm.realmalias_set.values('domain'))
def do_add_realm_alias(realm, domain): def do_add_realm_alias(realm, domain):
# type: (Realm, Text) -> (RealmAlias) # type: (Realm, Text) -> (RealmAlias)
alias = RealmAlias(realm=realm, domain=domain) alias = RealmAlias.objects.create(realm=realm, domain=domain)
alias.full_clean()
alias.save()
event = dict(type="realm_domains", op="add", event = dict(type="realm_domains", op="add",
alias=dict(id=alias.id, alias=dict(domain=alias.domain,
domain=alias.domain,
)) ))
send_event(event, active_user_ids(realm)) send_event(event, active_user_ids(realm))
return alias return alias
def do_remove_realm_alias(realm, alias_id): def do_remove_realm_alias(realm, domain):
# type: (Realm, int) -> None # type: (Realm, Text) -> None
RealmAlias.objects.get(pk=alias_id).delete() RealmAlias.objects.get(realm=realm, domain=domain).delete()
event = dict(type="realm_domains", op="remove", alias_id=alias_id) event = dict(type="realm_domains", op="remove", domain=domain)
send_event(event, active_user_ids(realm)) send_event(event, active_user_ids(realm))
def get_occupied_streams(realm): def get_occupied_streams(realm):

View File

@@ -334,7 +334,7 @@ def email_allowed_for_realm(email, realm):
def list_of_domains_for_realm(realm): def list_of_domains_for_realm(realm):
# type: (Realm) -> List[Text] # type: (Realm) -> List[Text]
return list(RealmAlias.objects.filter(realm = realm).values('domain', 'id')) return list(RealmAlias.objects.filter(realm=realm).values('domain'))
class RealmEmoji(ModelReprMixin, models.Model): class RealmEmoji(ModelReprMixin, models.Model):
author = models.ForeignKey('UserProfile', blank=True, null=True) author = models.ForeignKey('UserProfile', blank=True, null=True)

View File

@@ -815,7 +815,6 @@ class EventsRegisterTest(ZulipTestCase):
('type', equals('realm_domains')), ('type', equals('realm_domains')),
('op', equals('add')), ('op', equals('add')),
('alias', check_dict([ ('alias', check_dict([
('id', check_int),
('domain', check_string), ('domain', check_string),
])), ])),
]) ])
@@ -827,10 +826,10 @@ class EventsRegisterTest(ZulipTestCase):
schema_checker = check_dict([ schema_checker = check_dict([
('type', equals('realm_domains')), ('type', equals('realm_domains')),
('op', equals('remove')), ('op', equals('remove')),
('alias_id', check_int), ('domain', check_string),
]) ])
alias_id = RealmAlias.objects.get(realm=realm, domain='zulip.org').id alias = RealmAlias.objects.get(realm=realm, domain='zulip.org')
events = self.do_test(lambda: do_remove_realm_alias(realm, alias_id)) events = self.do_test(lambda: do_remove_realm_alias(realm, alias.domain))
error = schema_checker('events[0]', events[0]) error = schema_checker('events[0]', events[0])
self.assert_on_error(error) self.assert_on_error(error)

View File

@@ -47,12 +47,13 @@ class RealmAliasTest(ZulipTestCase):
# type: () -> None # type: () -> None
self.login("iago@zulip.com") self.login("iago@zulip.com")
realm = get_realm('zulip') realm = get_realm('zulip')
alias_id = RealmAlias.objects.create(realm=realm, domain='zulip.org').id RealmAlias.objects.create(realm=realm, domain='zulip.org')
aliases_count = RealmAlias.objects.count() aliases_count = RealmAlias.objects.count()
result = self.client_delete("/json/realm/domains/{0}".format(alias_id + 1)) result = self.client_delete("/json/realm/domains/non-existent.com")
self.assert_json_error(result, 'No such entry found.') self.assertEqual(result.status_code, 400)
self.assert_json_error(result, 'No entry found for domain non-existent.com.')
result = self.client_delete("/json/realm/domains/{0}".format(alias_id)) result = self.client_delete("/json/realm/domains/zulip.org")
self.assert_json_success(result) self.assert_json_success(result)
self.assertEqual(RealmAlias.objects.count(), aliases_count - 1) self.assertEqual(RealmAlias.objects.count(), aliases_count - 1)

View File

@@ -37,11 +37,11 @@ def create_alias(request, user_profile, domain=REQ(validator=check_string)):
@require_realm_admin @require_realm_admin
@has_request_variables @has_request_variables
def delete_alias(request, user_profile, alias_id): def delete_alias(request, user_profile, domain):
# type: (HttpRequest, UserProfile, int) -> (HttpResponse) # type: (HttpRequest, UserProfile, Text) -> (HttpResponse)
try: try:
# Ensure alias_id is an integer. Django passes captured url parameters as strings. RealmAlias.objects.get(realm=user_profile.realm, domain=domain)
do_remove_realm_alias(user_profile.realm, int(alias_id)) do_remove_realm_alias(user_profile.realm, domain)
except RealmAlias.DoesNotExist: except RealmAlias.DoesNotExist:
return json_error(_('No such entry found.')) return json_error(_('No entry found for domain %(domain)s.' % {'domain': domain}))
return json_success() return json_success()

View File

@@ -168,7 +168,7 @@ v1_api_and_json_patterns = [
url(r'^realm/domains$', rest_dispatch, url(r'^realm/domains$', rest_dispatch,
{'GET': 'zerver.views.realm_aliases.list_aliases', {'GET': 'zerver.views.realm_aliases.list_aliases',
'POST': 'zerver.views.realm_aliases.create_alias'}), 'POST': 'zerver.views.realm_aliases.create_alias'}),
url(r'^realm/domains/(?P<alias_id>\d+)$', rest_dispatch, url(r'^realm/domains/(?P<domain>\S+)$', rest_dispatch,
{'DELETE': 'zerver.views.realm_aliases.delete_alias'}), {'DELETE': 'zerver.views.realm_aliases.delete_alias'}),
# realm/emoji -> zerver.views.realm_emoji # realm/emoji -> zerver.views.realm_emoji