Revision 5af5920c
b/snf-astakos-app/astakos/im/api/__init__.py | ||
---|---|---|
256 | 256 |
|
257 | 257 |
form = FeedbackForm(request.POST) |
258 | 258 |
if not form.is_valid(): |
259 |
logger.error("Invalid feedback request: %r", form.errors) |
|
259 | 260 |
raise BadRequest('Invalid data') |
260 | 261 |
|
261 | 262 |
msg = form.cleaned_data['feedback_msg'] |
b/snf-cyclades-app/conf/20-snf-cyclades-app-api.conf | ||
---|---|---|
131 | 131 |
# endpoints. Set this to False if you deploy cyclades-app/astakos-app on the |
132 | 132 |
# same machine. |
133 | 133 |
#CYCLADES_PROXY_USER_SERVICES = True |
134 |
# |
|
135 |
## Astakos feedback endpoint. |
|
136 |
#CYCLADES_USER_FEEDBACK_URL = 'https://accounts.example.synnefo.org/feedback' |
b/snf-cyclades-app/conf/20-snf-cyclades-app-ui.conf | ||
---|---|---|
42 | 42 |
## How often to check for user usage changes |
43 | 43 |
#UI_QUOTAS_UPDATE_INTERVAL = 10000 |
44 | 44 |
# |
45 |
## List of emails used for sending the feedback messages to (following the ADMINS format) |
|
46 |
#FEEDBACK_CONTACTS = ( |
|
47 |
# # ('Contact Name', 'contact_email@domain.com'), |
|
48 |
#) |
|
49 |
# |
|
50 |
## Email from which the feedback emails will be sent from |
|
51 |
#FEEDBACK_EMAIL_FROM = "~okeanos <no-reply@grnet.gr>" |
|
52 |
# |
|
53 | 45 |
## URL to redirect not authenticated users |
54 | 46 |
#UI_LOGIN_URL = "/im/login" |
55 | 47 |
# |
... | ... | |
210 | 202 |
# 'admin@synnefo.gr': 'system', |
211 | 203 |
# 'images@synnefo.gr': 'system' |
212 | 204 |
#} |
213 |
# |
b/snf-cyclades-app/synnefo/api/delegate.py | ||
---|---|---|
71 | 71 |
|
72 | 72 |
@csrf_exempt |
73 | 73 |
def delegate_to_feedback_service(request): |
74 |
logger.debug("Delegate feedback request to %s" % USER_FEEDBACK_URL) |
|
74 | 75 |
token = request.META.get('HTTP_X_AUTH_TOKEN') |
75 | 76 |
headers = {'X-Auth-Token': token} |
76 | 77 |
return proxy(request, USER_FEEDBACK_URL, headers=headers, |
b/snf-cyclades-app/synnefo/app_settings/default/api.py | ||
---|---|---|
131 | 131 |
# endpoints. Set this to False if you deploy cyclades-app/astakos-app on the |
132 | 132 |
# same machine. |
133 | 133 |
CYCLADES_PROXY_USER_SERVICES = True |
134 |
|
|
135 |
# Astakos user_catalogs endpoint |
|
136 |
CYCLADES_USER_FEEDBACK_URL = 'https://accounts.example.synnefo.org/feedback' |
b/snf-cyclades-app/synnefo/app_settings/default/ui.py | ||
---|---|---|
42 | 42 |
# How often to check for user usage changes |
43 | 43 |
UI_QUOTAS_UPDATE_INTERVAL = 10000 |
44 | 44 |
|
45 |
# List of emails used for sending the feedback messages to (following the ADMINS format) |
|
46 |
FEEDBACK_CONTACTS = ( |
|
47 |
# ('Contact Name', 'contact_email@domain.com'), |
|
48 |
) |
|
49 |
|
|
50 |
# Email from which the feedback emails will be sent from |
|
51 |
FEEDBACK_EMAIL_FROM = "~okeanos <no-reply@grnet.gr>" |
|
52 |
|
|
53 | 45 |
# URL to redirect not authenticated users |
54 | 46 |
UI_LOGIN_URL = "/im/login" |
55 | 47 |
|
... | ... | |
211 | 203 |
'images@synnefo.gr': 'system' |
212 | 204 |
} |
213 | 205 |
|
206 |
# Astakos feedback endpoint. UI uses this setting to post error feedbacks |
|
207 |
CYCLADES_USER_FEEDBACK_URL = 'https://accounts.synnefo.org/feedback' |
b/snf-cyclades-app/synnefo/ui/static/snf/js/ui/web/ui_feedback_view.js | ||
---|---|---|
108 | 108 |
var extra = extra || {}; |
109 | 109 |
|
110 | 110 |
var data = { |
111 |
'feedback-msg': msg,
|
|
112 |
'feedback-data': this.get_feedback_data() || ""
|
|
111 |
'feedback_msg': msg,
|
|
112 |
'feedback_data': this.get_feedback_data() || ""
|
|
113 | 113 |
} |
114 | 114 |
|
115 | 115 |
var opts = { |
116 |
'url': 'feedback',
|
|
116 |
'url': synnefo.config.feedback_post_url,
|
|
117 | 117 |
'data': $.param(data), |
118 | 118 |
'success': this.show_success, |
119 | 119 |
'error': this.show_error, |
b/snf-cyclades-app/synnefo/ui/templates/home.html | ||
---|---|---|
104 | 104 |
var SKIP_TIMEOUTS = {{ skip_timeouts }}; |
105 | 105 |
var UPDATE_INTERVAL = {{ update_interval }}; |
106 | 106 |
var APP_DEBUG = {% if DEBUG %}true{% else %}false{% endif %}; |
107 |
var FEEDBACK_URL = "{% url ui_feedback %}"; |
|
108 |
var FEEDBACK_TITLE = "{% trans "Send feedback" %}"; |
|
109 | 107 |
var API_OVERLAY_TITLE = "{% trans "API access" %}"; |
110 | 108 |
var API_OVERLAY_SUBCONTENT = "{% trans "The API key provides full access to your <em>~okeanos</em> account, so always keep it private." %}"; |
111 | 109 |
|
... | ... | |
633 | 631 |
synnefo.config.machines_icons_url = '{{ SYNNEFO_IMAGES_URL }}icons/machines/'; |
634 | 632 |
synnefo.config.support_ssh_os_list = {{ support_ssh_os_list|safe }}; |
635 | 633 |
synnefo.config.os_created_users = {{ os_created_users|safe }}; |
634 |
synnefo.config.feedback_post_url = {{ feedback_post_url|safe }}; |
|
636 | 635 |
|
637 | 636 |
synnefo.config.logout_redirect = '{{ logout_redirect }}'; |
638 | 637 |
synnefo.config.login_redirect = '{{ login_redirect }}'; |
... | ... | |
676 | 675 |
synnefo.config.system_images_owners = {{ system_images_owners|safe }}; |
677 | 676 |
synnefo.ui.init(); |
678 | 677 |
synnefo.ui.main.bind("ready", function(){ |
678 |
|
|
679 |
synnefo.ui.trigger_error("test123"); |
|
679 | 680 |
}); |
680 | 681 |
|
681 | 682 |
}) |
b/snf-cyclades-app/synnefo/ui/urls.py | ||
---|---|---|
37 | 37 |
|
38 | 38 |
urlpatterns = patterns('', |
39 | 39 |
url(r'^$', 'synnefo.ui.views.home', name='ui_index'), |
40 |
url(r'^feedback$', 'synnefo.ui.views.feedback_submit', name='ui_feedback'), |
|
41 | 40 |
url(r'^userquota$', 'synnefo.ui.views.user_quota', name='ui_userquota'), |
42 | 41 |
url(r'userdata/', include('synnefo.ui.userdata.urls')) |
43 | 42 |
) |
b/snf-cyclades-app/synnefo/ui/views.py | ||
---|---|---|
126 | 126 |
# extensions |
127 | 127 |
ENABLE_GLANCE = getattr(settings, 'UI_ENABLE_GLANCE', True) |
128 | 128 |
GLANCE_API_URL = getattr(settings, 'UI_GLANCE_API_URL', '/glance') |
129 |
FEEDBACK_CONTACTS = getattr(settings, "FEEDBACK_CONTACTS", []) |
|
130 |
FEEDBACK_EMAIL_FROM = settings.FEEDBACK_EMAIL_FROM |
|
131 | 129 |
DIAGNOSTICS_UPDATE_INTERVAL = getattr(settings, |
132 | 130 |
'UI_DIAGNOSTICS_UPDATE_INTERVAL', 2000) |
133 | 131 |
|
... | ... | |
151 | 149 |
GROUPED_PUBLIC_NETWORK_NAME = getattr(settings, 'UI_GROUPED_PUBLIC_NETWORK_NAME', 'Internet') |
152 | 150 |
|
153 | 151 |
USER_CATALOG_URL = getattr(settings, 'UI_USER_CATALOG_URL', '/user_catalogs') |
152 |
FEEDBACK_POST_URL = getattr(settings, 'UI_FEEDBACK_POST_URL', '/feedback') |
|
154 | 153 |
TRANSLATE_UUIDS = not getattr(settings, 'TRANSLATE_UUIDS', False) |
155 | 154 |
|
156 | 155 |
def template(name, request, context): |
... | ... | |
177 | 176 |
'current_lang': get_language() or 'en', |
178 | 177 |
'compute_api_url': json.dumps(COMPUTE_API_URL), |
179 | 178 |
'user_catalog_url': json.dumps(USER_CATALOG_URL), |
179 |
'feedback_post_url': json.dumps(FEEDBACK_POST_URL), |
|
180 | 180 |
'translate_uuids': json.dumps(TRANSLATE_UUIDS), |
181 | 181 |
# update interval settings |
182 | 182 |
'update_interval': UPDATE_INTERVAL, |
... | ... | |
186 | 186 |
'update_interval_max': UPDATE_INTERVAL_MAX, |
187 | 187 |
'changes_since_alignment': CHANGES_SINCE_ALIGNMENT, |
188 | 188 |
'quotas_update_interval': QUOTAS_UPDATE_INTERVAL, |
189 |
# additional settings |
|
190 | 189 |
'image_icons': IMAGE_ICONS, |
191 | 190 |
'logout_redirect': LOGOUT_URL, |
192 | 191 |
'login_redirect': LOGIN_URL, |
... | ... | |
429 | 428 |
|
430 | 429 |
return response |
431 | 430 |
|
432 |
def feedback_submit(request): |
|
433 |
if not request.method == "POST": |
|
434 |
raise Http404 |
|
435 |
|
|
436 |
# fill request object with astakos user information |
|
437 |
get_user(request, settings.ASTAKOS_URL) |
|
438 |
|
|
439 |
message = request.POST.get("feedback-msg") |
|
440 |
data = request.POST.get("feedback-data") |
|
441 |
if isinstance(request.user.get('email'), list): |
|
442 |
email = request.user.get('email')[0] |
|
443 |
else: |
|
444 |
email = request.user.get('email') |
|
445 |
|
|
446 |
# default to True (calls from error pages) |
|
447 |
allow_data_send = request.POST.get("feedback-submit-data", True) |
|
448 |
|
|
449 |
mail_subject = unicode(_("Feedback from synnefo application")) |
|
450 |
|
|
451 |
mail_context = {'message': message, 'data': data, 'email': email, |
|
452 |
'allow_data_send': allow_data_send, 'request': request} |
|
453 |
mail_content = render_to_string("feedback_mail.txt", mail_context) |
|
454 |
|
|
455 |
send_mail(mail_subject, mail_content, FEEDBACK_EMAIL_FROM, |
|
456 |
dict(FEEDBACK_CONTACTS).values(), fail_silently=False) |
|
457 |
|
|
458 |
return HttpResponse('{"status":"send"}') |
Also available in: Unified diff