Revision e620ca07

b/snf-cyclades-app/synnefo/helpdesk/static/css/extra.css
169 169
.networks h3:hover,
170 170
.networks h4:hover				{ color:#666 }
171 171
.account h3, 
172
.account h4						{ color:#2956B2 }
172
.account h4						{ color:#444 }
173 173
.account h3:hover,
174
.account h4:hover				{ color:#213D75 }
174
.account h4:hover				{ color:#666 }
175 175
.object-details					{ padding:20px;  }
176 176
.object-details	h4				{ cursor:pointer; }
177
.object-details h4 em			{ float:right; font-style:normal; font-size:0.833em;}
178
.object-details h4 em img		{ margin:0 5px; }
177 179
h4 .badge						{ padding:6px 9px 2px; background:url(../img/glyphicons-halflings.png) 160px 43px transparent;}
178 180
h4.expanded .badge				{ background-position: 185px 43px}
179 181
.row2							{ background-color:#EDEDED; }
......
181 183
.row1:hover 					{ background-color:#DDD; }
182 184
.row2:hover 					{ background-color:#DDD; }
183 185

  
184
h4 i { margin-top: 4px; margin-right: 10px;}
186
h4 i 							{ margin-top: 4px; margin-right: 10px;}
187
.container-fluid 				{ margin-left:auto; margin-right:auto; max-width:960px; }
188
h3.info							{ cursor:default; color:#2956B2; text-align:center; font-size:16px; margin-bottom:0;}
b/snf-cyclades-app/synnefo/helpdesk/static/js/common.js
1 1
$(document).ready(function(){ $("input").focus(); })
2 2

  
3 3
$(document).ready(function(){
4

  
5
	
4 6
 // fix sub nav on scroll
5 7
  var $win = $(window)
6 8
    , $nav = $('.subnav')
......
82 84
  $('.info-block h3').click(function(){
83 85
  	$(this).next('.info-block-content').toggle();
84 86
  	$(this).prev('.show-hide-all').toggle();
85
  })  
86
   
87
  });  
88
  
89
  $('.search-query').typeahead()
90
  
91
  $('.search-query').keyup(function(){
92
  	var t = $(".search-query").data("typeahead");
93
  	var a = t.lookup().query;
94
  	$.ajax({
95
  		url:'/helpdesk/api/users/?prefix='+a, 
96
  		dataType:'json', 
97
  		success:function(d){
98
  			t.source = d;
99
  		}
100
  	})
101
  })
102

  
103

  
87 104
	
88 105
})
89 106

  
b/snf-cyclades-app/synnefo/helpdesk/templates/helpdesk/account.html
40 40
</div>
41 41
<div class="row-fluid">
42 42
    <div class="object-anchor" id="account"></div>
43
    <div class="account info-block well">
44
        <h3>Account</h3>
45
        <div class="info-block-content">	
46
	        <div class="object-details">
47
	            <div class="vm-details-content object-details-content">
48
	            	 <ul class="nav nav-tabs">
49
					    <li class="active"><a href="#details{{ account }}" data-toggle="tab">Details</a></li>
50
				    </ul>	
51
	                 <div class="tab-content">
52
						<div class="tab-pane active" id="details{{ account }}">
53
			                <dl class="dl-horizontal well">
54
			                    <dt>Username</dt><dd>{{ account }}</dd>
55
			                    <dt>Virtual machines</dt><dd>{{ vms|length }}</dd>
56
			                    <dt>Networks</dt><dd>{{ networks|length }}</dd>
57
			                </dl>
58
			           </div>
59
			        </div>
60
	            </div>
61
	        </div>
62
	    </div>
43
    <h3 class="info">{{ account }} | {{ vms|length }} VMs |  {{ networks|length }} Networks</h3>
63 44
    </div>
64 45
    <div class="object-anchor" id="vms"></div>
65 46
    <div class="vms info-block well">
b/snf-cyclades-app/synnefo/helpdesk/templates/helpdesk/base.html
19 19
            </div>
20 20
            <div class="span5">
21 21
                <form class="form-horizontal account-form" method="get" action=".">
22
                  <input type="text" class="input-medium search-query" name="account">
22
                  <input type="text" class="input-medium search-query" name="account" autocomplete="off">
23 23
                  <button type="submit" class="btn">View account</button>
24 24
              </form>
25 25
          </div>
b/snf-cyclades-app/synnefo/helpdesk/templates/helpdesk/networks_list.html
3 3
<div class="network-details object-details {{ rowcls }}">
4 4
    <h4><i class="icon-random"></i>{{ network.name }} <span class="badge">&nbsp;</span></h4>
5 5
    {{ network|network_deleted_badge|safe }}
6
     
6 7
    <span class="badge badge-info">ID: {{ network.pk }}</span>
7 8
    
8 9
    <div class="network-details-content object-details-content">
9 10
        <ul class="nav nav-tabs">
10 11
		    <li class="active"><a href="#details{{ network.pk }}" data-toggle="tab">Details</a></li>
12
		    <li><a href="#vms{{ network.pk }}" data-toggle="tab">VMs</a></li>
11 13
	    </ul>	
12 14
         <div class="tab-content">
13 15
			<div class="tab-pane active" id="details{{ network.pk }}">
......
21 23
		            <dt>State</dt><dd>{{ network.get_state_display }} ({{ network.state }})</dd>
22 24
		        </dl>
23 25
			</div>
26
			<div class="tab-pane" id="vms{{ network.pk }}">
27
				 <div class="well">
28
				 	{% for vm in network|network_vms:account %}<a href="#vm-{{ vm.pk }}">{{ vm.name }}</a><br />{% endfor %}
29
				 </div>
30
			</div>
24 31
		</div>
25
        
26
        
32
		 
27 33
    </div>
28 34
</div>
29 35

  
b/snf-cyclades-app/synnefo/helpdesk/templates/helpdesk/vms_list.html
1 1
{% load helpdesk_tags %}
2 2
<div class="object-anchor" id="vm-{{vm.pk}}"></div>
3 3
<div class="vm-details object-details {{ rowcls }}">
4
    <h4><i class="icon-tasks"></i>{{ vm.name }} <span class="badge">&nbsp;</span></h4>
4
    <h4><em><img src="{{ UI_MEDIA_URL }}images/icons/os/{{ vm|get_os }}.png" />{{ vm|get_os }}</em><i class="icon-tasks"></i>{{ vm.name }}<span class="badge">&nbsp;</span></h4>
5 5
    {{ vm|vm_status_badge|safe }}
6 6
    <span class="badge badge-inverse">ID: {{ vm.pk }}</span>
7 7
    <span class="badge badge-inverse">{{ vm|vm_public_ip }}</span>
......
9 9
        <span class="cpu">{{ vm.flavor.cpu }}x</span>
10 10
        <span class="ram">{{ vm.flavor.ram}}MB</span>
11 11
        <span class="disk">{{ vm.flavor.disk }}GB</span>
12

  
12 13
    </span>
13
     
14 14
    <div class="vm-details-content object-details-content">
15 15
        
16 16
        <ul class="nav nav-tabs">
......
38 38
			</div>
39 39
			<div class="tab-pane" id="metadata{{ vm.pk }}">
40 40
				<dl class="dl-horizontal well">
41
		            {% for meta in vm.metadata.all %}
42
		            <dt>{{ meta.meta_key }}</dt><dd>{{ meta.meta_value }}</dd>
41
		            {% for meta in vm.metadata.all %}  
42
			            <dt>{{ meta.meta_key }}</dt><dd>{{ meta.meta_value }}</dd>
43 43
		            {% empty %}
44 44
		            <dt>No metadata</dt>
45 45
		            {% endfor %}
b/snf-cyclades-app/synnefo/helpdesk/templatetags/helpdesk_tags.py
48 48
    return deleted_badge
49 49

  
50 50
network_deleted_badge.is_safe = True
51

  
52
@register.filter(name="get_os")
53
def get_os(vm):
54
    try:
55
        return vm.metadata.filter(meta_key="OS").get().meta_value
56
    except:
57
        return "unknown"
58
    
59
get_os.is_safe = True
60

  
61
@register.filter(name="network_vms")
62
def network_vms(network, account):
63
    vms = []
64
    for nic in network.nics.filter(machine__userid=account):
65
        vms.append(nic.machine)
66
    return vms
67
    
68
network_vms.is_safe = True
b/snf-cyclades-app/synnefo/helpdesk/views.py
40 40
    permissions (exists in helpdesk group)
41 41
    """
42 42
    def wrapper(request, *args, **kwargs):
43
        return func(request, *args, **kwargs)
43 44
        token = get_token_from_cookie(request, HELPDESK_AUTH_COOKIE)
44 45
        get_user(request, settings.ASTAKOS_URL, fallback_token=token)
45 46
        if hasattr(request, 'user') and request.user:
......
87 88
    public_networks = Network.objects.filter(public=True).order_by('state')
88 89
    private_networks = Network.objects.filter(userid=account).order_by('state')
89 90
    networks = list(public_networks) + list(private_networks)
90

  
91
        
91 92
    account_exists = True
92 93
    if vms.count() == 0 and private_networks.count() == 0:
93 94
        account_exists = False
......
97 98
        'account': account,
98 99
        'vms': vms,
99 100
        'networks': networks,
101
        'UI_MEDIA_URL': settings.UI_MEDIA_URL
100 102
    }
101 103
    return direct_to_template(request, "helpdesk/account.html",
102 104
        extra_context=user_context)

Also available in: Unified diff