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