Working add list
This commit is contained in:
1 parent
80b1a24ee4
commit
f0f4f4539f
8 files changed
+274
-195
No files matched your search
+30
-1
@@ -1,5 +1,18 @@
|
|||||||
import requests
|
import requests
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
import logging
|
||||||
|
from rest_framework import exceptions
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class DPDAPIException(exceptions.APIException):
|
||||||
|
status_code = 503
|
||||||
|
detail = 'Unknown error.'
|
||||||
|
|
||||||
|
def __init__(self, status_code, detail):
|
||||||
|
self.status_code = status_code
|
||||||
|
self.detail = detail
|
||||||
|
|
||||||
|
|
||||||
class DjangoPostfixDovecotAPI(object):
|
class DjangoPostfixDovecotAPI(object):
|
||||||
@@ -26,7 +39,11 @@ class DjangoPostfixDovecotAPI(object):
|
|||||||
json=json,
|
json=json,
|
||||||
headers=headers)
|
headers=headers)
|
||||||
|
|
||||||
r.raise_for_status()
|
try:
|
||||||
|
r.raise_for_status()
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
logger.warning('mxapi errored {}'.format(e.response))
|
||||||
|
raise DPDAPIException(status_code=e.response.status_code, detail=e.response.json())
|
||||||
|
|
||||||
return r.json()
|
return r.json()
|
||||||
|
|
||||||
@@ -46,4 +63,16 @@ class DjangoPostfixDovecotAPI(object):
|
|||||||
'GET',
|
'GET',
|
||||||
'/aliases/',
|
'/aliases/',
|
||||||
params=params
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
def list_domains(self, name=None):
|
||||||
|
params = {}
|
||||||
|
|
||||||
|
if name is not None:
|
||||||
|
params['name'] = name
|
||||||
|
|
||||||
|
return self._api(
|
||||||
|
'GET',
|
||||||
|
'/domains/',
|
||||||
|
params=params
|
||||||
)
|
)
|
||||||
@@ -30,11 +30,13 @@ class OrgUnitSerializer(serializers.ModelSerializer):
|
|||||||
class AliasSerializer(serializers.Serializer):
|
class AliasSerializer(serializers.Serializer):
|
||||||
source = serializers.EmailField(required=True)
|
source = serializers.EmailField(required=True)
|
||||||
destination = serializers.EmailField(required=True)
|
destination = serializers.EmailField(required=True)
|
||||||
_domain_name = settings.NEUF_EMAIL_DOMAIN_NAME
|
domain = serializers.IntegerField(required=True)
|
||||||
|
|
||||||
def validate_destonation(self, attrs, source):
|
def validate_source(self, value):
|
||||||
domain_part = attrs[source].split('@')[1]
|
_domain_name = settings.NEUF_EMAIL_DOMAIN_NAME
|
||||||
if domain_part != self._domain_name:
|
|
||||||
raise serializers.ValidationError("dest '{0}' is not in domain {1}".format(attrs[source], self._domain_name))
|
|
||||||
|
|
||||||
return attrs
|
domain_part = value.split('@')[1]
|
||||||
|
if domain_part != _domain_name:
|
||||||
|
raise serializers.ValidationError("source '{0}' is not in domain {1}".format(value, _domain_name))
|
||||||
|
|
||||||
|
return value
|
||||||
@@ -67,7 +67,8 @@
|
|||||||
var api_urls = {
|
var api_urls = {
|
||||||
aliases: '/api/aliases/',
|
aliases: '/api/aliases/',
|
||||||
ou_list: '/api/orgunits/',
|
ou_list: '/api/orgunits/',
|
||||||
me: '/api/me/'
|
me: '/api/me/',
|
||||||
|
email_domain: '/api/emaildomain/'
|
||||||
};
|
};
|
||||||
var forwards_container = $(".forwards-container");
|
var forwards_container = $(".forwards-container");
|
||||||
nunjucks.configure({ autoescape: true });
|
nunjucks.configure({ autoescape: true });
|
||||||
@@ -87,103 +88,117 @@
|
|||||||
$('.orgunit-list li a[data-prefix="'+prefix+'"]').parent().toggleClass('active');
|
$('.orgunit-list li a[data-prefix="'+prefix+'"]').parent().toggleClass('active');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* New list */
|
$.getJSON(api_urls.email_domain, function(email_domain) {
|
||||||
var new_list_html = nunjucks.render('new_list.html', {
|
email_domain = email_domain.domain;
|
||||||
orgunits: data,
|
console.log(email_domain);
|
||||||
api_urls: api_urls
|
|
||||||
});
|
|
||||||
|
|
||||||
|
/* New list */
|
||||||
$('.new-list').html(new_list_html);
|
var new_list_html = nunjucks.render('new_list.html', {
|
||||||
$('.new-list .js-new-list-name').on('keyup', function() {
|
orgunits: data,
|
||||||
var new_list_name = $('.new-list .js-new-list-name').val();
|
api_urls: api_urls,
|
||||||
if(new_list_name === '') {
|
email_domain: email_domain
|
||||||
new_list_name = 'Ny liste';
|
|
||||||
} else {
|
|
||||||
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
|
||||||
new_list_name = 'NY: ' + prefix + new_list_name + "@studentersamfundet.no";
|
|
||||||
}
|
|
||||||
$('.js-new-list-preview').text(new_list_name);
|
|
||||||
});
|
|
||||||
/* Prefix select */
|
|
||||||
$('.new-list .prefix-select a').on('click', function() {
|
|
||||||
$('.new-list .prefix-select a').parent().removeClass('active');
|
|
||||||
$(this).parent().addClass('active');
|
|
||||||
var prefix = $(this).parent().attr('data-value');
|
|
||||||
$('.new-list .prefix-btn').html(prefix+' <span class="caret"></span>');
|
|
||||||
});
|
|
||||||
// TODO put this in a function with selector as argument
|
|
||||||
$('.new-list textarea').on('keyup', function() {
|
|
||||||
var text = $(this).val();
|
|
||||||
var emails = parseEmails(text);
|
|
||||||
|
|
||||||
if(emails.length > 0) {
|
|
||||||
$('.new-list .email-counter').text(emails.length);
|
|
||||||
} else {
|
|
||||||
$('.new-list .email-counter').text('');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('.js-add-list').on('click', function(e) {
|
|
||||||
$('.new-list .result').html(''); // reset errors
|
|
||||||
e.preventDefault();
|
|
||||||
/* Validate */
|
|
||||||
var new_list_name = $('.new-list .js-new-list-name').val();
|
|
||||||
if(new_list_name.length === 0) {
|
|
||||||
notify('Ny epostliste', 'Navn på epostliste mangler', 'error');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var text = $('.new-list textarea').val();
|
|
||||||
var emails = parseEmails(text);
|
|
||||||
if(emails.length === 0) {
|
|
||||||
notify('Ny epostliste', 'Ingen eposter i epost-feltet...', 'error');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Valid form
|
|
||||||
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
|
||||||
var dest = prefix + new_list_name + "@studentersamfundet.no";
|
|
||||||
|
|
||||||
var new_list = {};
|
|
||||||
new_list[dest] = _.map(emails, function(el) {
|
|
||||||
return {'dest': dest, 'forward': el};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$.post(
|
|
||||||
api_urls.aliases,
|
$('.new-list').html(new_list_html);
|
||||||
new_list[dest],
|
$('.new-list .js-new-list-name').on('keyup', function() {
|
||||||
function() {
|
var new_list_name = $('.new-list .js-new-list-name').val();
|
||||||
notify('Lagt til', 'Ny liste: ' + dest + 'lagt til', 'success');
|
if(new_list_name === '') {
|
||||||
|
new_list_name = 'Ny liste';
|
||||||
|
} else {
|
||||||
|
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
||||||
|
new_list_name = 'NY: ' + prefix + new_list_name + "@" + email_domain.name;
|
||||||
|
}
|
||||||
|
$('.js-new-list-preview').text(new_list_name);
|
||||||
|
});
|
||||||
|
/* Prefix select */
|
||||||
|
$('.new-list .prefix-select a').on('click', function() {
|
||||||
|
$('.new-list .prefix-select a').parent().removeClass('active');
|
||||||
|
$(this).parent().addClass('active');
|
||||||
|
var prefix = $(this).parent().attr('data-value');
|
||||||
|
$('.new-list .prefix-btn').html(prefix+' <span class="caret"></span>');
|
||||||
|
});
|
||||||
|
// TODO put this in a function with selector as argument
|
||||||
|
$('.new-list textarea').on('keyup', function() {
|
||||||
|
var text = $(this).val();
|
||||||
|
var emails = parseEmails(text);
|
||||||
|
|
||||||
|
if(emails.length > 0) {
|
||||||
|
$('.new-list .email-counter').text(emails.length);
|
||||||
|
} else {
|
||||||
|
$('.new-list .email-counter').text('');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.js-add-list').on('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
/* Validate */
|
||||||
|
var new_list_name = $('.new-list .js-new-list-name').val();
|
||||||
|
if(new_list_name.length === 0) {
|
||||||
|
notify('Ny epostliste', 'Navn på epostliste mangler', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var text = $('.new-list textarea').val();
|
||||||
|
var emails = parseEmails(text);
|
||||||
|
if(emails.length === 0) {
|
||||||
|
notify('Ny epostliste', 'Ingen eposter i epost-feltet...', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Valid form
|
||||||
|
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
||||||
|
var source = prefix + new_list_name + "@" + email_domain.name;
|
||||||
|
|
||||||
|
var new_aliases = {};
|
||||||
|
new_aliases = _.map(emails, function(el) {
|
||||||
|
return {
|
||||||
|
'source': source,
|
||||||
|
'destination': el,
|
||||||
|
'domain': email_domain.id
|
||||||
|
};
|
||||||
|
});
|
||||||
|
console.log(new_aliases);
|
||||||
|
$.ajax({
|
||||||
|
url: api_urls.aliases,
|
||||||
|
type: 'POST',
|
||||||
|
headers: {'X-CSRFToken': csrf_token},
|
||||||
|
dataType: 'json',
|
||||||
|
contentType: "application/json; charset=utf-8",
|
||||||
|
data: JSON.stringify(new_aliases),
|
||||||
|
|
||||||
|
}).done(function(resp) {
|
||||||
|
console.log(resp);
|
||||||
|
notify('Lagt til', 'Ny liste: ' + source + ' lagt til', 'success');
|
||||||
$('.new-list textarea').val('');
|
$('.new-list textarea').val('');
|
||||||
$('.new-list .js-new-list-name').val('');
|
$('.new-list .js-new-list-name').val('');
|
||||||
},
|
// FIXME: Existing list?
|
||||||
'json'
|
var added_list_html = nunjucks.render('list.html', { lists: new_aliases });
|
||||||
);
|
forwards_container.prepend(added_list_html);
|
||||||
var added_list_html = nunjucks.render('list.html', { lists: new_list });
|
});
|
||||||
forwards_container.prepend(added_list_html);
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Filter lists by orgunit */
|
/* Filter lists by orgunit */
|
||||||
$(".orgunit-list a").on('click', function(e) {
|
$(".orgunit-list a").on('click', function(e) {
|
||||||
var prefix = $(this).attr('data-prefix');
|
var prefix = $(this).attr('data-prefix');
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
/* Toggle selection */
|
/* Toggle selection */
|
||||||
$(".orgunit-list li").removeClass('active');
|
$(".orgunit-list li").removeClass('active');
|
||||||
$(this).parent().toggleClass('active');
|
$(this).parent().toggleClass('active');
|
||||||
$('.orgunits-select').val(prefix);
|
$('.orgunits-select').val(prefix);
|
||||||
|
|
||||||
filter_lists('^'+prefix+'-', true);
|
filter_lists('^'+prefix+'-', true);
|
||||||
$('.js-lists-filter-field').val('');
|
$('.js-lists-filter-field').val('');
|
||||||
});
|
});
|
||||||
$(".orgunits-select").on('change', function() {
|
$(".orgunits-select").on('change', function() {
|
||||||
var prefix = $(this).val();
|
var prefix = $(this).val();
|
||||||
|
|
||||||
/* Toggle selection */
|
/* Toggle selection */
|
||||||
$(".orgunit-list li").removeClass('active');
|
$(".orgunit-list li").removeClass('active');
|
||||||
$(".orgunit-list li a[data-prefix="+prefix+"]").parent().toggleClass('active');
|
$(".orgunit-list li a[data-prefix="+prefix+"]").parent().toggleClass('active');
|
||||||
|
|
||||||
filter_lists('^'+prefix+'-', true);
|
filter_lists('^'+prefix+'-', true);
|
||||||
$('.js-lists-filter-field').val('');
|
$('.js-lists-filter-field').val('');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</span>
|
</span>
|
||||||
<input type="text" class="form-control js-new-list-name">
|
<input type="text" class="form-control js-new-list-name">
|
||||||
<span class="input-group-addon">@studentersamfundet.no</span>
|
<span class="input-group-addon">@{{email_domain.name}}</span>
|
||||||
</div>
|
</div>
|
||||||
<h4>Eposter <span class="badge email-counter"></span></h4>
|
<h4>Eposter <span class="badge email-counter"></span></h4>
|
||||||
<textarea class="form-control" placeholder="asdf@studentersamfundet.no, qwerty@studentersamfundet.no f.eks. Klipp og lim så mye du orker" rows="4"></textarea>
|
<textarea class="form-control" placeholder="asdf@studentersamfundet.no, qwerty@studentersamfundet.no f.eks. Klipp og lim så mye du orker" rows="4"></textarea>
|
||||||
|
|||||||
+102
-87
@@ -67,7 +67,8 @@
|
|||||||
var api_urls = {
|
var api_urls = {
|
||||||
aliases: '/api/aliases/',
|
aliases: '/api/aliases/',
|
||||||
ou_list: '/api/orgunits/',
|
ou_list: '/api/orgunits/',
|
||||||
me: '/api/me/'
|
me: '/api/me/',
|
||||||
|
email_domain: '/api/emaildomain/'
|
||||||
};
|
};
|
||||||
var forwards_container = $(".forwards-container");
|
var forwards_container = $(".forwards-container");
|
||||||
nunjucks.configure({ autoescape: true });
|
nunjucks.configure({ autoescape: true });
|
||||||
@@ -87,103 +88,117 @@
|
|||||||
$('.orgunit-list li a[data-prefix="'+prefix+'"]').parent().toggleClass('active');
|
$('.orgunit-list li a[data-prefix="'+prefix+'"]').parent().toggleClass('active');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* New list */
|
$.getJSON(api_urls.email_domain, function(email_domain) {
|
||||||
var new_list_html = nunjucks.render('new_list.html', {
|
email_domain = email_domain.domain;
|
||||||
orgunits: data,
|
console.log(email_domain);
|
||||||
api_urls: api_urls
|
|
||||||
});
|
|
||||||
|
|
||||||
|
/* New list */
|
||||||
$('.new-list').html(new_list_html);
|
var new_list_html = nunjucks.render('new_list.html', {
|
||||||
$('.new-list .js-new-list-name').on('keyup', function() {
|
orgunits: data,
|
||||||
var new_list_name = $('.new-list .js-new-list-name').val();
|
api_urls: api_urls,
|
||||||
if(new_list_name === '') {
|
email_domain: email_domain
|
||||||
new_list_name = 'Ny liste';
|
|
||||||
} else {
|
|
||||||
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
|
||||||
new_list_name = 'NY: ' + prefix + new_list_name + "@studentersamfundet.no";
|
|
||||||
}
|
|
||||||
$('.js-new-list-preview').text(new_list_name);
|
|
||||||
});
|
|
||||||
/* Prefix select */
|
|
||||||
$('.new-list .prefix-select a').on('click', function() {
|
|
||||||
$('.new-list .prefix-select a').parent().removeClass('active');
|
|
||||||
$(this).parent().addClass('active');
|
|
||||||
var prefix = $(this).parent().attr('data-value');
|
|
||||||
$('.new-list .prefix-btn').html(prefix+' <span class="caret"></span>');
|
|
||||||
});
|
|
||||||
// TODO put this in a function with selector as argument
|
|
||||||
$('.new-list textarea').on('keyup', function() {
|
|
||||||
var text = $(this).val();
|
|
||||||
var emails = parseEmails(text);
|
|
||||||
|
|
||||||
if(emails.length > 0) {
|
|
||||||
$('.new-list .email-counter').text(emails.length);
|
|
||||||
} else {
|
|
||||||
$('.new-list .email-counter').text('');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('.js-add-list').on('click', function(e) {
|
|
||||||
$('.new-list .result').html(''); // reset errors
|
|
||||||
e.preventDefault();
|
|
||||||
/* Validate */
|
|
||||||
var new_list_name = $('.new-list .js-new-list-name').val();
|
|
||||||
if(new_list_name.length === 0) {
|
|
||||||
notify('Ny epostliste', 'Navn på epostliste mangler', 'error');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var text = $('.new-list textarea').val();
|
|
||||||
var emails = parseEmails(text);
|
|
||||||
if(emails.length === 0) {
|
|
||||||
notify('Ny epostliste', 'Ingen eposter i epost-feltet...', 'error');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Valid form
|
|
||||||
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
|
||||||
var dest = prefix + new_list_name + "@studentersamfundet.no";
|
|
||||||
|
|
||||||
var new_list = {};
|
|
||||||
new_list[dest] = _.map(emails, function(el) {
|
|
||||||
return {'dest': dest, 'forward': el};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$.post(
|
|
||||||
api_urls.aliases,
|
$('.new-list').html(new_list_html);
|
||||||
new_list[dest],
|
$('.new-list .js-new-list-name').on('keyup', function() {
|
||||||
function() {
|
var new_list_name = $('.new-list .js-new-list-name').val();
|
||||||
notify('Lagt til', 'Ny liste: ' + dest + 'lagt til', 'success');
|
if(new_list_name === '') {
|
||||||
|
new_list_name = 'Ny liste';
|
||||||
|
} else {
|
||||||
|
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
||||||
|
new_list_name = 'NY: ' + prefix + new_list_name + "@" + email_domain.name;
|
||||||
|
}
|
||||||
|
$('.js-new-list-preview').text(new_list_name);
|
||||||
|
});
|
||||||
|
/* Prefix select */
|
||||||
|
$('.new-list .prefix-select a').on('click', function() {
|
||||||
|
$('.new-list .prefix-select a').parent().removeClass('active');
|
||||||
|
$(this).parent().addClass('active');
|
||||||
|
var prefix = $(this).parent().attr('data-value');
|
||||||
|
$('.new-list .prefix-btn').html(prefix+' <span class="caret"></span>');
|
||||||
|
});
|
||||||
|
// TODO put this in a function with selector as argument
|
||||||
|
$('.new-list textarea').on('keyup', function() {
|
||||||
|
var text = $(this).val();
|
||||||
|
var emails = parseEmails(text);
|
||||||
|
|
||||||
|
if(emails.length > 0) {
|
||||||
|
$('.new-list .email-counter').text(emails.length);
|
||||||
|
} else {
|
||||||
|
$('.new-list .email-counter').text('');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.js-add-list').on('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
/* Validate */
|
||||||
|
var new_list_name = $('.new-list .js-new-list-name').val();
|
||||||
|
if(new_list_name.length === 0) {
|
||||||
|
notify('Ny epostliste', 'Navn på epostliste mangler', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var text = $('.new-list textarea').val();
|
||||||
|
var emails = parseEmails(text);
|
||||||
|
if(emails.length === 0) {
|
||||||
|
notify('Ny epostliste', 'Ingen eposter i epost-feltet...', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Valid form
|
||||||
|
var prefix = $('.new-list .prefix-select .active').attr('data-value');
|
||||||
|
var source = prefix + new_list_name + "@" + email_domain.name;
|
||||||
|
|
||||||
|
var new_aliases = {};
|
||||||
|
new_aliases = _.map(emails, function(el) {
|
||||||
|
return {
|
||||||
|
'source': source,
|
||||||
|
'destination': el,
|
||||||
|
'domain': email_domain.id
|
||||||
|
};
|
||||||
|
});
|
||||||
|
console.log(new_aliases);
|
||||||
|
$.ajax({
|
||||||
|
url: api_urls.aliases,
|
||||||
|
type: 'POST',
|
||||||
|
headers: {'X-CSRFToken': csrf_token},
|
||||||
|
dataType: 'json',
|
||||||
|
contentType: "application/json; charset=utf-8",
|
||||||
|
data: JSON.stringify(new_aliases),
|
||||||
|
|
||||||
|
}).done(function(resp) {
|
||||||
|
console.log(resp);
|
||||||
|
notify('Lagt til', 'Ny liste: ' + source + ' lagt til', 'success');
|
||||||
$('.new-list textarea').val('');
|
$('.new-list textarea').val('');
|
||||||
$('.new-list .js-new-list-name').val('');
|
$('.new-list .js-new-list-name').val('');
|
||||||
},
|
// FIXME: Existing list?
|
||||||
'json'
|
var added_list_html = nunjucks.render('list.html', { lists: new_aliases });
|
||||||
);
|
forwards_container.prepend(added_list_html);
|
||||||
var added_list_html = nunjucks.render('list.html', { lists: new_list });
|
});
|
||||||
forwards_container.prepend(added_list_html);
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Filter lists by orgunit */
|
/* Filter lists by orgunit */
|
||||||
$(".orgunit-list a").on('click', function(e) {
|
$(".orgunit-list a").on('click', function(e) {
|
||||||
var prefix = $(this).attr('data-prefix');
|
var prefix = $(this).attr('data-prefix');
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
/* Toggle selection */
|
/* Toggle selection */
|
||||||
$(".orgunit-list li").removeClass('active');
|
$(".orgunit-list li").removeClass('active');
|
||||||
$(this).parent().toggleClass('active');
|
$(this).parent().toggleClass('active');
|
||||||
$('.orgunits-select').val(prefix);
|
$('.orgunits-select').val(prefix);
|
||||||
|
|
||||||
filter_lists('^'+prefix+'-', true);
|
filter_lists('^'+prefix+'-', true);
|
||||||
$('.js-lists-filter-field').val('');
|
$('.js-lists-filter-field').val('');
|
||||||
});
|
});
|
||||||
$(".orgunits-select").on('change', function() {
|
$(".orgunits-select").on('change', function() {
|
||||||
var prefix = $(this).val();
|
var prefix = $(this).val();
|
||||||
|
|
||||||
/* Toggle selection */
|
/* Toggle selection */
|
||||||
$(".orgunit-list li").removeClass('active');
|
$(".orgunit-list li").removeClass('active');
|
||||||
$(".orgunit-list li a[data-prefix="+prefix+"]").parent().toggleClass('active');
|
$(".orgunit-list li a[data-prefix="+prefix+"]").parent().toggleClass('active');
|
||||||
|
|
||||||
filter_lists('^'+prefix+'-', true);
|
filter_lists('^'+prefix+'-', true);
|
||||||
$('.js-lists-filter-field').val('');
|
$('.js-lists-filter-field').val('');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -205,7 +205,9 @@ output += "-</a></li>\n\t\t\t";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
frame = frame.pop();
|
frame = frame.pop();
|
||||||
output += "\n\t\t\t</ul>\n\t\t</span>\n\t\t<input type=\"text\" class=\"form-control js-new-list-name\">\n\t\t<span class=\"input-group-addon\">@studentersamfundet.no</span>\n\t</div>\n \t<h4>Eposter <span class=\"badge email-counter\"></span></h4>\n <textarea class=\"form-control\" placeholder=\"asdf@studentersamfundet.no, qwerty@studentersamfundet.no f.eks. Klipp og lim så mye du orker\" rows=\"4\"></textarea>\n <button type=\"button\" class=\"btn btn-primary btn-add-list js-add-list\"><span class=\"glyphicon glyphicon-plus js-add-list\" aria-hidden=\"true\"></span> Opprett liste</button>\n </div>\n</div>";
|
output += "\n\t\t\t</ul>\n\t\t</span>\n\t\t<input type=\"text\" class=\"form-control js-new-list-name\">\n\t\t<span class=\"input-group-addon\">@";
|
||||||
|
output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "email_domain")),"name", env.autoesc), env.autoesc);
|
||||||
|
output += "</span>\n\t</div>\n \t<h4>Eposter <span class=\"badge email-counter\"></span></h4>\n <textarea class=\"form-control\" placeholder=\"asdf@studentersamfundet.no, qwerty@studentersamfundet.no f.eks. Klipp og lim så mye du orker\" rows=\"4\"></textarea>\n <button type=\"button\" class=\"btn btn-primary btn-add-list js-add-list\"><span class=\"glyphicon glyphicon-plus js-add-list\" aria-hidden=\"true\"></span> Opprett liste</button>\n </div>\n</div>";
|
||||||
cb(null, output);
|
cb(null, output);
|
||||||
;
|
;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
+2
-1
@@ -1,7 +1,7 @@
|
|||||||
from django.conf.urls import patterns, url
|
from django.conf.urls import patterns, url
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
from mailadmin.views import MyUserViewSet, MyOrgUnitViewSet, OrgUnitViewSet, AliasesView
|
from mailadmin.views import MyUserViewSet, MyOrgUnitViewSet, OrgUnitViewSet, AliasesView, get_domain
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register(r'me', MyUserViewSet, base_name='me')
|
router.register(r'me', MyUserViewSet, base_name='me')
|
||||||
@@ -12,4 +12,5 @@ urlpatterns = router.urls
|
|||||||
urlpatterns += patterns(
|
urlpatterns += patterns(
|
||||||
'',
|
'',
|
||||||
url(r'^aliases/$', AliasesView.as_view(), name='aliases'),
|
url(r'^aliases/$', AliasesView.as_view(), name='aliases'),
|
||||||
|
url(r'^emaildomain/$', get_domain, name='email-domain'),
|
||||||
)
|
)
|
||||||
+26
-11
@@ -1,3 +1,4 @@
|
|||||||
|
from django.conf import settings
|
||||||
from django.contrib.auth import login, logout as auth_logout
|
from django.contrib.auth import login, logout as auth_logout
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.forms import AuthenticationForm
|
from django.contrib.auth.forms import AuthenticationForm
|
||||||
@@ -6,6 +7,7 @@ from django.shortcuts import render, redirect
|
|||||||
import logging
|
import logging
|
||||||
from requests import exceptions
|
from requests import exceptions
|
||||||
from rest_framework import viewsets, views
|
from rest_framework import viewsets, views
|
||||||
|
from rest_framework.decorators import api_view
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
@@ -46,7 +48,7 @@ def logout(request):
|
|||||||
|
|
||||||
|
|
||||||
class AliasesView(views.APIView):
|
class AliasesView(views.APIView):
|
||||||
""" List, create and delete aliases from mxapi """
|
""" List, create and delete aliases from django-postfix-dovecot-api """
|
||||||
_api = DjangoPostfixDovecotAPI()
|
_api = DjangoPostfixDovecotAPI()
|
||||||
permission_classes = (SourcePrefixOwner,)
|
permission_classes = (SourcePrefixOwner,)
|
||||||
|
|
||||||
@@ -73,30 +75,32 @@ class AliasesView(views.APIView):
|
|||||||
if len(my_prefixes) == 0:
|
if len(my_prefixes) == 0:
|
||||||
return Response({'result': 'No results'}) # Need at least one
|
return Response({'result': 'No results'}) # Need at least one
|
||||||
|
|
||||||
try:
|
res = self._api.list_aliases_regex(regexp)
|
||||||
res = self._api.list_aliases_regex(regexp)
|
|
||||||
except exceptions.RequestException as e:
|
|
||||||
logger.warning('mxapi errored {}'.format(e.strerror))
|
|
||||||
return Response({'error': e.strerror}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
||||||
|
|
||||||
return Response(res)
|
return Response(res)
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
aliases = AliasSerializer(data=request.DATA, many=True)
|
aliases = AliasSerializer(data=request.data, many=True)
|
||||||
if not aliases.is_valid():
|
if not aliases.is_valid():
|
||||||
return Response(aliases.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(aliases.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
res = self._api.create_aliases(aliases.data)
|
res = self._api.create_aliases(aliases.data)
|
||||||
|
|
||||||
return Response(res)
|
return Response(res)
|
||||||
|
|
||||||
def delete(self, request):
|
def delete(self, request):
|
||||||
aliases = AliasSerializer(data=request.DATA, many=True)
|
aliases = AliasSerializer(data=request.data, many=True)
|
||||||
if not aliases.is_valid():
|
if not aliases.is_valid():
|
||||||
return Response(aliases.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(aliases.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
# FIXME: not tested
|
try:
|
||||||
# res = self._api.delete_aliases(aliases)
|
# FIXME: not tested
|
||||||
res = {'errors': 'Not implemented'}
|
# res = self._api.delete_aliases(aliases)
|
||||||
|
res = {'errors': 'Not implemented'}
|
||||||
|
except exceptions.RequestException as e:
|
||||||
|
logger.warning('mxapi errored {}'.format(e.strerror))
|
||||||
|
return Response({'error': e.strerror}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
return Response(res)
|
return Response(res)
|
||||||
|
|
||||||
|
|
||||||
@@ -127,3 +131,14 @@ class OrgUnitViewSet(viewsets.ReadOnlyModelViewSet):
|
|||||||
queryset = OrgUnit.objects.all()
|
queryset = OrgUnit.objects.all()
|
||||||
serializer_class = OrgUnitSerializer
|
serializer_class = OrgUnitSerializer
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(['GET'])
|
||||||
|
def get_domain(request):
|
||||||
|
api = DjangoPostfixDovecotAPI()
|
||||||
|
domains = api.list_domains(name=settings.NEUF_EMAIL_DOMAIN_NAME)
|
||||||
|
|
||||||
|
if len(domains) != 1:
|
||||||
|
return Response({'domain': domains})
|
||||||
|
|
||||||
|
return Response({'domain': domains[0]})
|
||||||
Reference in new issue
Block a user